s5pc100 LED驱动

一个简单的led驱动设备模型demo 以三星s5pc100的N类引脚的最低一位作为一个led灯设备
开发环境: 宿主机fedora13,交叉编译工具arm-linux-gcc4.3.2  处理器 s5pc100
先建一个工程文件夹 
/home/led/  
                   device/  下放led设备有关文件
                                s5pc100_led.h s5pc100_leddev.c Makefile
                   driver/    led驱动程序
                               s5pc100_led.h s5pc100_leddriver.c Makefile
                   test/    测试程序
                              led_test.c  Makefile

本文先介绍device目录下的3个文件

s5pc100_led.h具体内容

  1. #ifndef _LED_ANDROID_H_  
  2. #define _LED_ANDROID_H_  
  3. #include <linux/cdev.h>  
  4. #include <linux/semaphore.h>  
  5. #define LED_DEVICE_NODE_NAME  "led"  
  6. #define LED_DEVICE_FILE_NAME  "led"  
  7. #define LED_DEVICE_PROC_NAME  "led"  
  8. #define LED_DEVICE_CLASS_NAME "led"  
  9. struct led_android_dev  
  10. {  
  11.     int val;//设备属性  
  12.     struct semaphore sem;//信号量  
  13.     struct cdev dev;  
  14.     //这个地方还不是很规范  
  15.     unsigned long pc100_ncon; //gpio的N类引脚的控制寄存器 虚拟地址  
  16.     unsigned long pc100_ndat; //gpio的N类引脚的数据寄存器 虚拟地址  
  17. };  
  18.   
  19. struct resource s3c_led_res[1] = {  
  20.     [0] = {  
  21.         .start = 0x56000000,  
  22.         .end = 0x560000ff,  
  23.         .flags = IORESOURCE_MEM,  
  24.     },  
  25. };  
  26. #endif  

s5pc100_leddev.c函数具体内容

  1. #include <linux/module.h>  
  2. #include <linux/init.h>  
  3. #include <linux/platform_device.h>  
  4. #include "s5pc100_led.h"  
  5.   
  6. void led_dev_release(struct device *dev){  
  7.     printk("<kernel> release\n");  
  8. }  
  9.   
  10. struct resource s3c_led_res[1] = {//led设备资源  
  11.     [0] = {  
  12.         .start = 0xE03001C0,//N类引脚寄存器物理起始地址  
  13.         .end = 0xE03001C8,//N类引脚寄存器物理结束地址  
  14.         .flags = IORESOURCE_MEM,//资源标识为IO空间  
  15.     },  
  16. };  
  17.   
  18. struct platform_device s3c_led_dev = {  
  19.     .name = "led",  
  20.     .id = -1,  
  21.     .dev = {  
  22.         //.platform_data=&pc100_platdata,这里可以添加平台私有数据  
  23.         .release = led_dev_release,  
  24.     },  
  25.     .num_resources = ARRAY_SIZE(s3c_led_res),//platform资源的数量,为1  
  26.     .resource = s3c_led_res,  
  27. };  
  28.   
  29. static int __init led_device_init(void){  
  30.     int ret;  
  31.     ret = platform_device_register(&s3c_led_dev);  
  32.     if(ret){  
  33.         printk("device register failed!\n");  
  34.         return ret;   
  35.     }  
  36.     printk("led device init\n");  
  37.     return 0;  
  38. }  
  39.   
  40. static void __exit led_device_exit(void){  
  41.     platform_device_unregister(&s3c_led_dev);  
  42.     printk("led device bye!\n");  
  43. }  
  44.   
  45. module_init(led_device_init);//注册设备  
  46. module_exit(led_device_exit);//卸载设备  
  47. MODULE_LICENSE("GPL");  
  48. MODULE_AUTHOR("kevin");  

Makefile具体内容

  1. KERNELDIR = /home/s5pc100-kernel  
  2. PWD := $(shell pwd)  
  3. INSTALLDIR = /tftpboot  
  4. #CROSS_COMPILE    :=      
  5. #CC = $(CROSS_COMPILE)gcc  
  6. obj-m :s5pc100_leddev.o  
  7.       
  8. .PHONY: modules modules_install clean  
  9. modules:  
  10.     $(MAKE) -C $(KERNELDIR)  M=$(PWD) modules  
  11.     cp dev.ko  $(INSTALLDIR)  
  12. modules_install:  
  13.     cp dev.ko $(INSTALLDIR)  
  14. clean:  
  15.     rm  *.ko   

以上为动态注册设备,一般我们设备的注册选用的是静态注册,在arch/arm/目录下 找到对应开发板 的bsp文件  我的开发板为ut-s5pc100 cpu为s5pc100 

arch/arm/mach-smdkc100.c这个文件 中添加:

  1. static struct platform_device *smdkc100_devices[] __initdata 前面添加如下如下语句  
  2. /*led  device 2011.9.29*/  
  3. struct resource s3c_led_res[1] = {//led设备资源  
  4. [0] = {  
  5.     .start = 0xE03001C0,//N类引脚寄存器物理起始地址  
  6.     .end = 0xE03001C8,//N类引脚寄存器物理结束地址  
  7.     .flags = IORESOURCE_MEM,//资源标识为IO空间  
  8.        },  
  9. };  
  10. struct platform_device s3c_led_dev = {  
  11.     .name = "led",  
  12.     .id = -1,  
  13.     .dev = {  
  14.         //.platform_data=&pc100_platdata,这里可以添加平台私有数据  
  15.         .release = led_dev_release,  
  16.     },  
  17.     .num_resources = ARRAY_SIZE(s3c_led_res),//platform资源的数量,为1  
  18.     .resource = s3c_led_res,  
  19. };  
  20. 并 在static struct platform_device *smdkc100_devices[] __initdata结构体中的最后面添加  
  21.     &s3c_led_dev,  
重新编译内核即可。

下文添加led设备驱动


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值