内核自带LED驱动移植

来源:互联网 发布:淘宝怎么更改退款金额 编辑:程序博客网 时间:2024/05/16 19:33

在fl2440的内核中,本身已经有了LED驱动,我们要根据自己的需求将它使能即可,重要的是如何找到需要修改的位置如何修改。在前面分析过我们自己写的驱动代码,内核中自带的驱动原理也大概相似,首先make menuconfig 下添加内核对LED驱动的支持,然后我们要在内核的drivers/目录下找到leds,然后去看s3c24xx.c里的代码,前面在plat-led中分析过设备和驱动是如何找到彼此的,通过.name,找到设备名,然后返回内核目录下,用grep命令查找我们在驱动中的.name,看设备文件在哪里,然后根据fl2440的硬件原理图对其进行修改,返回内核目录下执行make,       OK。


下面是实际操作过程。

一、首先在内核中添加对LED的支持。

[fanmaolin@Centeros linux-3.0]$ make menuconfig

Device Drivers  --->  

[*] LED Support  --->  


[*]   LED Class Support  

<*>   LED Support for Samsung S3C24XX GPIO LEDs    



二、找到设备信息,进行修改


[fanmaolin@Centeros linux-3.0]$ cd drivers/



会看到leds,


[fanmaolin@Centeros drivers]$ cd leds/


在里面找到 leds-s3c24xx.c   



 [fanmaolin@Centeros leds]$ vim leds-s3c24xx.c

找到.name     =    "s3c24xx_led"我们用它来找到设备信息文件



用grep命令寻找包含这个字符串的文件

[fanmaolin@Centeros linux-3.0]$ grep s3c24xx_led -r *



arch/arm/plat-s3c24xx/common-smdk.c里寻找


根据原理图修改结构体里的信息



[fanmaolin@Centeros linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c

/* LED devices */ 50  51 static struct s3c24xx_led_platdata smdk_pdata_led4 = { 52     .gpio       = S3C2410_GPB(5),//根据手册改引脚  分别改为5、6、8、10 53     .flags      = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 54     .name       = "led0",//.name 可以根据自己习惯改,不改也无所谓 55     .def_trigger    = "timer", 56 }; 57  58 static struct s3c24xx_led_platdata smdk_pdata_led5 = { 59     .gpio       = S3C2410_GPB(6), 60     .flags      = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 61     .name       = "led1", 62     .def_trigger    = "nand-disk", 63 }; 64  65 static struct s3c24xx_led_platdata smdk_pdata_led6 = { 66     .gpio       = S3C2410_GPB(8), 67     .flags      = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 68     .name       = "led2", 69 }; 70  71 static struct s3c24xx_led_platdata smdk_pdata_led7 = { 72     .gpio       = S3C2410_GPB(10), 73     .flags      = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE, 74     .name       = "led3", 75 };


这样就可以了,然后make编译,重新安装内核。。。


三、开发板上进行测试


我们可以在sys/class下看到leds



关于sys/:

sysfs 文件系统总是被挂载在 /sys 挂载点上,sysfs 是 Linux 内核中设计较新的一种虚拟的基于内存的文件系统,它的作用与proc 有些类似,但除了与 proc 相同的具有查看和设定内核参数功能之外,还有为 Linux 统一设备模型作为管理之用。它给用户提供了一个从用户空间去访问内核设备的方法,写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件。在/sys/devices 下是所有设备的真实对象,包括如视频卡和以太网卡等真实的设备,也包括 ACPI 等不那么显而易见的真实设备,还有 tty, bonding 等纯粹虚拟的设备;在其它目录如 class, bus 等中则在分类的目录中含有大量对 devices 中真实对象引用的符号链接文件.  


更多详细的关于sysfs的介绍,可以参考:https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/index.html


对于我们的LED,linux把他当作是直接挂载在总线上的,可以直接通过/sys上操作对应文件而控制LED。


可以看到设备信息。

进入led2,

brightness是控制灯的亮灭,>1亮,0灭。 max_brightness可以控制灯的亮度


现在我们对其进行实际操作  

>: echo 2 > brightness


可以看到第三盏灯亮

>: echo 0 > brightness  ,,灯灭。

其它的灯可以同样进行这样的操作。

也可以写一个程序直接对其进行操作,而不用进到文件里面。。。



0 0
原创粉丝点击