娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

喜羊羊系列之【設備-驅動 動態載入進內核】

發布者:快樂家庭最新更新時間:2025-01-07 來源: cnblogs關鍵字:動態 手機看文章 掃描二維碼
隨時隨地手機看文章

led.h


#ifndef _HEAD_H
#define _HEAD_H

#define MAGIC 'h'

#define LED_ON 		_IOW(MAGIC,1,int)
#define LED_OFF 	_IOW(MAGIC,0,int)

struct led_device{
 	dev_t 			devno;
	unsigned int 	led_major;
	struct cdev	 	*led_cdev;
	struct class 	*led_class;
	struct device 	*led_device;
};
#endif

平臺設備

dev_led.c


#include <linux/init.h>
#include 
#include 
#include 'led.h'

static void led_release(struct device *dev){
	
}

static struct platform_device s5pv210_led_device_lhy = {
	.name			= 	's5pv210_led_lhy',
	.id				= 	1,

	.dev			=	{
			.release 	= led_release,  //開發模式下,這個真不能少!
	},
};

static int __init dev_led_init(void){
	platform_device_register(&s5pv210_led_device_lhy);
	return 0;
}

static void __exit dev_led_exit(void){
	platform_device_unregister(&s5pv210_led_device_lhy);
}

module_init(dev_led_init);
module_exit(dev_led_exit);
MODULE_LICENSE('GPL');

平臺驅動

led_drv.c


#include
#include
#include		//register_chrled
#include	//class_create/ledice_create
#include		//kmalloc
#include		//copy_to_user/copy_from_user
#include			//ioremap
#includegpio.h>		//gpio_request
#include 	//s3c_gpio_cfgpin
#include      //cdev_alloc

#include 


#include'led.h'

static struct led_device *led_drv;

static int led_open(struct inode *inode, struct file *file)
{	
	printk(KERN_INFO'%s()-%dn', __func__, __LINE__);
	
	s3c_gpio_cfgpin(S5PV210_GPC0(3),S3C_GPIO_OUTPUT);
	s3c_gpio_cfgpin(S5PV210_GPC0(4),S3C_GPIO_OUTPUT);

	return 0;
}

static ssize_t led_read(struct file *file, char __user *buf, size_t count, loff_t *offset)
{
	printk(KERN_INFO'%s()-%dn', __func__, __LINE__);
	return count;
}

ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
{
	printk(KERN_INFO'%s()-%dn', __func__, __LINE__);
	return 0;
}

static long led_ioctl(struct file *file, unsigned int cmd, unsigned long val)
{
	printk(KERN_INFO'%s()-%dn', __func__, __LINE__);
	printk(KERN_INFO'cmd=%d arg=%ldn', cmd, val);

	switch(cmd)
	{
		case LED_ON:
			gpio_set_value(S5PV210_GPC0(val),1);
			break;
		case LED_OFF:
			gpio_set_value(S5PV210_GPC0(val),0);
			break;
		default:
			break;
	}
	return 0;
}


//硬件操作方法
static struct file_operations led_fops={
		.owner	= THIS_MODULE,	
		.open   = led_open,
		.write  = led_write,
		.read   = led_read,
		.unlocked_ioctl = led_ioctl,
};



static int s5pv210_led_probe(struct platform_device *pdrv){
	int ret;
	led_drv = kmalloc(sizeof(struct led_device),GFP_KERNEL);
	if(led_drv==NULL){
		printk(KERN_ERR'no memory malloc for fs210_ledn');
		return -ENOMEM;
	}

	/*1. 動態注冊/申請主設備*/
	ret=alloc_chrdev_region(&led_drv->devno,0,1,'dev_module');
	if (ret < 0) {
		printk(KERN_ERR 'unable to get majorn');
		return -EFAULT;
		goto out_err_1;
	}	
	
	//從設備號中分離出主設備號
	led_drv->led_major = MAJOR(led_drv->devno);
	/*為cdev分配空間*/
	led_drv->led_cdev  = cdev_alloc();
	/*注冊硬件操作方法/初始化cdev*/
	cdev_init(led_drv->led_cdev,&led_fops);
	/*注冊字符設備*/
	cdev_add(led_drv->led_cdev,led_drv->devno,1);


	/*2. 創建設備類*/
	led_drv->led_class=class_create(THIS_MODULE,'led_class');
	if (IS_ERR(led_drv->led_class)) {
		printk(KERN_ERR 'class_create() failed for led_classn');
		ret = -ENODATA;
		goto out_err_2;
	}


	/*3. 創建設備文件*/
	led_drv->led_device=device_create(led_drv->led_class,NULL,MKDEV(led_drv->led_major,0),NULL,'led'); //   /led/xxx
	if (IS_ERR(led_drv->led_device)) {
		printk(KERN_ERR 'device_create failed for led_devicen');
		ret = -ENODEV;
		goto out_err_3;
	}
	

	/*申請GPC0_3,4引腳資源*/
	gpio_request(S5PV210_GPC0(3),'LED1');
	gpio_request(S5PV210_GPC0(4),'LED2');


	return 0;
out_err_3:
	class_destroy(led_drv->led_class);
out_err_2:
	unregister_chrdev(led_drv->led_major,'led_module');
out_err_1:
	kfree(led_drv);
	return ret;

}
static int s5pv210_led_remove(struct platform_device *pdrv){
	unregister_chrdev(led_drv->led_major,'led_module');
	device_destroy(led_drv->led_class,MKDEV(led_drv->led_major,0));
	class_destroy(led_drv->led_class);
	gpio_free(S5PV210_GPC0(3));
	gpio_free(S5PV210_GPC0(4));
	kfree(led_drv);
	return 0;
}


struct platform_device_id led_ids[]={
	[0]={
		.name = 's5pv210_led_lhy',
		.driver_data = 0,
	},
};

static struct platform_driver s5pv210_led_driver = {
	.probe	= s5pv210_led_probe,
	.remove = s5pv210_led_remove,
	.driver = {		.name = 's5pv210_led_lhy',
		.owner = THIS_MODULE,	},
	.id_table = led_ids,
}; 

static int __init led_init(void)
{
	platform_driver_register(&s5pv210_led_driver);
	return 0;
}

static void __exit led_exit(void)
{
	platform_driver_unregister(&s5pv210_led_driver);

}


module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE('GPL');

測試程序



#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 'led.h'

/*
** ./led_test on	num	點亮LED1/2
** ./led_test off	num	熄滅LED1/2
*/
int main(int argc, char *argv[])
{
	if (argc != 3)
			printf('input:< %s on led_num >or< %s off led_num>n',argv[0],argv[0]);

	int fd;
	unsigned int cmd=0;
	unsigned long val=0;
	
	fd=open('/dev/led', O_RDWR);
	if(fd<0){
		perror('open failed!n');
		exit(1);
	}

	if(strcmp(argv[1],'on')==0){
		cmd=LED_ON;
	}else if(strcmp(argv[1],'off')==0){
		cmd=LED_OFF;
	}else{
		printf('err input!n');
	}

	val = atoi(argv[2]);

	if(ioctl(fd,cmd,val)<0){
		perror('ioctl failed!n');
		exit(1);
	}

	close(fd);
	return 0;
}


Makefile


ifeq ($(KERNELRELEASE),)
	KERNELDIR =/home/farsight/work/kernel/linux-3.0.8
	PWD =$(shell pwd)
modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
	arm-none-linux-gnueabi-gcc led_test.c -o led_test
	cp led_drv.ko dev_led.ko led_test /opt/filesystem/s5pv210
modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
	rm -rf *.so *.o *.ko *test  .tmp_versions *.mod.c *.order *.symvers 
else
	obj-m :=led_drv.o dev_led.o
endif


關鍵字:動態 引用地址:喜羊羊系列之【設備-驅動 動態載入進內核】

上一篇:linux驅動(七)gpiolib庫詳解
下一篇:tiny210裸機第1課(啟動原理)

推薦閱讀最新更新時間:2025-04-24 16:16

意法半導體推出尺寸緊湊的750W家電和工業設備電機驅動參考板
STDRIVE101三相柵極驅動器芯片為電機帶來高功率密度和很低的睡眠功耗 組裝好的參考設計板已在意法半導體電子商城上架開售 2024 年 8月 1 日,中國—— 意法半導體的 EVLDRIVE101-HPD(高功率密度)電機驅動參考設計在直徑僅為 50 毫米的圓形 PCB 電路板上集成三相柵極驅動器、STM32G0微控制器和750W功率級。 該板的睡眠功耗很低,還不到1uA,小巧的外形可直接裝入吹風機、手持式吸塵器、電動工具、風扇等設備,還可以輕松放入無人機、機器人以及電泵、制程自動化系統等工業設備的電驅裝置內。 該參考設計采用意法半導體穩健、緊湊的STDRIVE101 三相柵極驅動器,允許開發者自由靈活選
[工業控制]
意法半導體推出尺寸緊湊的750W家電和工業<font color='red'>設備</font>電機<font color='red'>驅動</font>參考板
mini2440 ADC可調電阻驅動程序開發源代碼(雜項設備驅動框架)
/*********************************************************/ /****s3c2440 ADC可調電阻驅動程序開發源代碼(雜項設備驅動框架)****/ /********************************************************/ #include #include #include #define DEVICE_NAME adc_driver /*設備名稱*/ static void __iomem *adc_base; /*定義了一個用來保存經過虛擬映射后的內存地址 */ static struct clk *adc_cl
[單片機]
RTOS設備驅動向嵌人式Linux的移植
Linux暴風雨般占領了嵌入式系統市場。分析家指出,大約有1/3到1/2的32/64位新的嵌入式系統設計采用了Linux。嵌入式Linux已經在很多應用領域顯示出優勢,比如SOHO家庭網絡和成像/多功能外設。在(NAS/SAN)存儲,家庭數字娛樂(HDTV/PVR/DVR/STB),和手持設備/無線設備,特別是數字移動電話更獲得大幅度發展。 嵌入式Linux新應用不會憑空從開發者的頭腦中冒出來,大部分項目都是由成千上萬行,甚至數百萬行的代碼組成。成千上百的嵌入式項目已經成功地將現有的其它平臺的代碼移植到Linux下,比如WindRiverVxWorks和pSOS,VRTX,Nucleus和其它RTOS。這些移植工作有著重要的
[工業控制]
RTOS<font color='red'>設備</font><font color='red'>驅動</font>向嵌人式Linux的移植
節能需求推動AC驅動設備市場強勢增長
由于化學、接合劑、金屬、制藥、發電、油氣、水和廢水以及金屬和礦產等各個行業的巨大需求,高功率和低功率AC驅動設備的市場都經歷了強勁增長。 ARC咨詢集團的一份有關高功率AC驅動設備市場的新報告指出,在未來5年里,預計全球高功率AC驅動設備市場將以9.1%的年復合增長率(CAGR)增長。2006年該市場總值超過47億美元,而到2011年將接近74億美元。 而該集團的一份有關低功率AC驅動設備市場的報告指出,未來5年預計全球低功率AC驅動設備市場將以7.9%的年復合增長率(CAGR)增長。2006年該市場總值大約為60億美元,而到2011年將超過87億美元。 對于能源和基本材料的需求正在以不可思議的速度增長,推動了全球對于AC驅
[焦點新聞]
C64x系列DSP/BIOS中設備驅動程序的設計
摘要:為了高效地對外部設備進行控制,給硬件設備編寫驅動程序是一種有效的解決方法。C64x系列的DSP系統提出了類/微型驅動模型的驅動程序結構。實踐結果表明,采用類/微型驅動模型進行驅動程序設計后,應用軟件可以復用絕大部分相似設備的驅動程序,因而極大地提高了驅動程序的開發效率。 關鍵詞:數字信號處理器 I/O設備驅動 類/微型驅動模型 實時操作系統 隨著新技術的不斷涌現和DSP實時系統的日趨復雜,不同類型的外部設備越來越多。為這些外部設備編寫驅動程序已經成為依賴操作系統管理硬件的內在要求。但是,由于內存管腳、響應時間和電源管理等條件的限制,為一個給定的DSP系統編寫設備驅動程序有時候會很困難。針對設備驅動程序開發者遇到的上述難
[嵌入式]
Elonroad和Hydro修建可為電動汽車動態充電的道路
  Elonroad已與瑞典隆德大學合作,受委托在隆德市中心的Getingev?gen修建1,000米的道路。EVolution Road是一個為期三年的項目,瑞典交通管理局打算將其用作示范站點。   Hydro通過為該項目制造關鍵的鋁制電氣回路來提供協助。高科技電動道路概念可在停車和駕駛時為所有類型的電動汽車充電。隆德(Lund)的1,000米測試路段正在建設中,并將于今年6月投入運營。這將是第一個在城市環境中安裝的電動道路系統。   在2018年10月,Elonroad與Hydro舉行了會議,討論了擠壓鋁型材(“公路型材”)的交付問題,該鋁型材可能包含電子設備和在駕駛時為電動汽車充電的導軌。此類輪廓需要沿其整個長度以
[新能源]
單片機控制LCD1602顯示屏動態顯示字符串
仿真電路圖: 仿真實驗結果: C語言程序代碼: //------------------------------------------------*/ #include reg52.h //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義 #include intrins.h sbit RS = P2^4; //定義端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0
[單片機]
單片機控制LCD1602顯示屏<font color='red'>動態</font>顯示字符串
七件大事了解機器人產業動態
周末已至,本周里 機器人 圈子又發生了哪些熱點資訊呢?大疆 無人機 新增隱私模式,美軍封殺前就已開始籌備;技術突破!專家設計出可自我修復的軟性機器人;合肥狠砸20億,欲打造一流機器人產業園;新松發布半年報,欲拓展3C市場。更多精彩內容請看詳細資訊: 大疆無人機新增隱私模式,美軍封殺前就在籌備 近日,美國陸軍日前突然高調發布禁令:下屬單位一律停用所有中國企業大疆創新(DJI)生產的無人機及相關產品,理由是大疆的產品存在“網絡安全漏洞”。 隨后,美國聯邦政府部門公布了此前針對大疆無人機展開的一項調查顯示,大疆無人機能夠確保數據安全,美國軍方因此被這逆轉的結果啪啪打臉。 隨后,大疆宣布,將在9月份向旗下無人機推送軟件更新,增加一個全新
[嵌入式]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 赣榆县| 建湖县| 聂拉木县| 博客| 无棣县| 成武县| 温宿县| 衡水市| 太保市| 井陉县| 砚山县| 兴安盟| 三明市| 莱州市| 阿拉善右旗| 全椒县| 兰州市| 苏州市| 九江县| 陆河县| 乌鲁木齐县| 新泰市| 应用必备| 吉安县| 三原县| 军事| 旅游| 紫云| 伊宁市| 呼和浩特市| 三门县| 新昌县| 鱼台县| 纳雍县| 从化市| 广饶县| 洞头县| 泾源县| 蕉岭县| 明溪县| 仁布县|