在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 ,,灯灭。
其它的灯可以同样进行这样的操作。
也可以写一个程序直接对其进行操作,而不用进到文件里面。。。