内核自带LED驱动移植

时间:2021-08-25 16:32:53

在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驱动移植

[*]   LED Class Support  

<*>   LED Support for Samsung S3C24XX GPIO LEDs    

内核自带LED驱动移植


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


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

内核自带LED驱动移植


会看到leds,


[fanmaolin@Centeros drivers]$ cd leds/

内核自带LED驱动移植

在里面找到 leds-s3c24xx.c   



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

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

内核自带LED驱动移植


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

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

内核自带LED驱动移植


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


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

内核自带LED驱动移植


[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

内核自带LED驱动移植


关于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。

内核自带LED驱动移植

可以看到设备信息。

进入led2,

内核自带LED驱动移植

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


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

>: echo 2 > brightness

内核自带LED驱动移植

可以看到第三盏灯亮

>: echo 0 > brightness  ,,灯灭。

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

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