*針對不同的平臺。可能放進(jìn)的不是以下的文件內(nèi),僅僅做參考
1、頭文件
放進(jìn):linux-3.0.8archarmplat-samsungincludeplat
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
====================================================================================================================================
2、設(shè)備文件
方法一:將設(shè)備資源直接加進(jìn)/linux-3.0.8/arch/arm/mach-s5pv210下的mach-smdkv210.c
①
struct platform_device s5pv210_led_device_lhy = {
.name = 's5pv210_led_lhy',
.id = 1,
};
static struct platform_device *smdkv210_devices[] __initdata = {
。。
。。。
。
。。。
。。。
。
。。
。。
。。。
。。。
。。。。
}
②將設(shè)備信息加入總線
改動arch/arm/mach-s5pv210/mach-smdkv210.c文件
static struct platform_device *smdkv210_devices[] __initdata = {
...
...
/*加入例如以下代碼*/
&s5pv210_led_device_lhy, //新加入的
}
方法二:
①將設(shè)備文件dev-led.c 放進(jìn) linux-3.0.8/arch/arm/plat-samsung
led_dev.c
#include #include #include #include struct platform_device s5pv210_led_device_lhy = { .name = 's5pv210_led_lhy', .id = 1, }; ②向arch/arm/mach-s5pv210/mach-smdkv210.c(跟平臺架構(gòu)相關(guān)文件)加入 static struct platform_device *smdkv210_devices[] __initdata = { .... &s5pv210_led_device_lhy, //新加入 }; ③向linux-3.0.8/arch/arm/plat-samsung/Makefile加入 obj-$(CONFIG_S3C_DEV_LED) += led_dev.o ④向linux-3.0.8/arch/arm/plat-samsung/Kconfig加入 config S3C_DEV_LED bool 'S5PV210 LED driver support' help s5pv210 led device support ⑤加入外部聲明arch/arm/plat-samsung/include/plat/devs.h extern struct platform_device s5pv210_led_device_lhy; ==================================================================================================================================== 3、平臺驅(qū)動 ①將led_drv.c 放進(jìn)linux-3.0.8/drivers/my_led led_drv.c #include #include #include #include #include #include #include #include #include //下面是移植時(shí)須要添加的 #include #include #include #include #include #include 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. 動態(tài)注冊/申請主設(shè)備*/ 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; } //從設(shè)備號中分離出主設(shè)備號 led_drv->led_major = MAJOR(led_drv->devno); /*為cdev分配空間*/ led_drv->led_cdev = cdev_alloc(); /*注冊硬件操作方法/初始化cdev*/ cdev_init(led_drv->led_cdev,&led_fops); /*注冊字符設(shè)備*/ cdev_add(led_drv->led_cdev,led_drv->devno,1); /*2. 創(chuàng)建設(shè)備類*/ 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. 創(chuàng)建設(shè)備文件*/ 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 __devinit s5pv210_led_init(void) { return platform_driver_register(&s5pv210_led_driver); } static void __devexit s5pv210_led_exit(void) { platform_driver_unregister(&s5pv210_led_driver); } module_init(s5pv210_led_init); module_exit(s5pv210_led_exit); MODULE_DESCRIPTION('LED driver for Marvell PM860x'); MODULE_AUTHOR('kiron'); MODULE_LICENSE('GPL'); MODULE_ALIAS('platform:s5pv210-led'); ②在當(dāng)前文件夾的Kconfig后加入,沒有就新建 config S5PV210_LED_DRV tristate 'led_dev for fs210 device' help led driver is for s5pv210, choose y/m/n ③在當(dāng)前文件夾的Makefile后加入,沒有就新建 obj-$(CONFIG_S5PV210_LED_DRV) = led_drv.o ④改動上級文件夾的Makefile和Kconfig 將linux-3.0.8/drivers/Kconfig 加入 source 'drivers/my_led/Kconfig' 將linux-3.0.8/drivers/Makefile 加入 obj-y += mydriver/ 最后就是自己make menuconfig里配置選項(xiàng)了。 ==================================================================================================================================== 4、測試程序編譯測試要使用交叉工具連 arm-none-linux-gnueabi-gcc led_test.c -o led_test 附: 將可運(yùn)行文件增加到開機(jī)啟動,改動根文件系統(tǒng)filesystem vi filesystem/etc/init.d/rcS ./star_app/led_test 測試程序 #include #include #include #include #include #include #include #include #include #define MAGIC 'h' #define LED_ON _IOW(MAGIC,1,int) #define LED_OFF _IOW(MAGIC,0,int) static void my_sleep(int n){ int j; for(j=0; j<10000000*n; j++); } int main(void) { printf('-------------------------------n' '|| start:一閃一閃亮晶晶 ||n' '-------------------------------n'); my_sleep(1); 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); } int i; for(i=0; i<10; i++){ if(i%2==0) cmd=LED_OFF; else cmd=LED_ON; val=3; //亮 led3 if(ioctl(fd,cmd,val)<0){ perror('ioctl failed!n'); exit(1); } val=4; //亮 led4 if(ioctl(fd,cmd,val)<0){ perror('ioctl failed!n'); exit(1); } my_sleep(1); } close(fd); return 0; }
上一篇:gpiolib庫詳解
下一篇:Linux下簡易蜂鳴器驅(qū)動代碼及測試實(shí)例
- 熱門資源推薦
- 熱門放大器推薦
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動授時(shí)的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- AM6TW-2409DH35Z ±9V 6 瓦單路輸出 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- 基于A6985F5V的38 V,0.5 A同步降壓型開關(guān)穩(wěn)壓器評估板
- LT4276BHUFD 25.5W(類型 2)PoE+ 電源在反激模式下的典型應(yīng)用電路,具有 12V、1.9A 輸出
- 【訓(xùn)練營】ESP8266時(shí)鐘+548151A
- 【涂鴉智能】涂鴉&立創(chuàng)EDA物聯(lián)網(wǎng)溫濕度傳感器
- LT1021DCN8-10 電壓基準(zhǔn)的典型應(yīng)用,將 10V 單元調(diào)整為 10.24V
- 具有 5V 輸出的 LT1074CT 正負(fù)轉(zhuǎn)換器的典型應(yīng)用
- LT6656BCDC-2.048、2.048V 低功率 ADC 電壓基準(zhǔn)的典型應(yīng)用
- SC1117 0.8 安培正固定穩(wěn)壓器的典型應(yīng)用
- 電路DIY驅(qū)動板DRSSTC
- OEM機(jī)器制造商利用仿真軟件提高效率
- 基于機(jī)器視覺的帶鋼焊縫定位
- 米爾RK3576核心板適配多種系統(tǒng),解鎖多樣化應(yīng)用
- 實(shí)時(shí)控制和通信領(lǐng)域的IT/OT融合如何推動工業(yè)自動化
- IXD0579M高壓側(cè)和低壓側(cè)柵極驅(qū)動器提供緊湊型即插即用解決方案
- 如何讓自動化領(lǐng)域的串口設(shè)備具備聯(lián)網(wǎng)能力?
- MBD應(yīng)用于霍爾組件位置選定
- 村田汽車和工業(yè)設(shè)備用PoC系統(tǒng)靜噪對策:難點(diǎn)及攻略全解析,別錯過
- 智慧節(jié)點(diǎn)的遠(yuǎn)程運(yùn)動控制實(shí)現(xiàn)可靠的自動化
- Windows 11電腦USB-C接口功能混亂結(jié)束了 微軟:所有接口必須支持?jǐn)?shù)據(jù)、充電和顯示
- 美司法部調(diào)查谷歌:發(fā)起反壟斷調(diào)查
- 本月新機(jī)匯總 看到底誰才有“嚇人的技術(shù)”
- 華為急單涌現(xiàn)而至?COF大缺貨!
- 榮耀9i傳聞匯:外觀清新,或搭載“嚇人的技術(shù)”
- 華為事件,致聯(lián)發(fā)科P90產(chǎn)品的ASP較高
- 浙大研制新型存儲器:面積僅幾十分之一
- 胡偉武:核心技術(shù)需要在試錯中發(fā)展
- 傳感器大發(fā) 微機(jī)電封裝2022年產(chǎn)值達(dá)64.6億美元
- 美光:存儲器一路好到2021年
- 聯(lián)發(fā)科推出8核12nm P22芯片,中端手機(jī)喜迎人工智能