在之前的学习中,学习了led普通字符设备以及platform总线的led。其实在linux的内核中,已经有了对s3c24xx的led支持,我们只要稍作修改便可以使能它。
一、添加内核支持
make menuconfig
Device Drivers --->
[*] LED Support --->
将如上选项选上即可。
二、代码修改
想查看自带的代码可以到[tangbin@localhost linux-3.0]$ vim drivers/leds/leds-s3c24xx.c
查找。
接下来修改:
我们的fl2440上LED的GPIO分别为PB5,PB6,PB8PB10,只需要修改成我们的即可。
vim arch/arm/plat-s3c24xx/common-smdk.c
49 /* LED devices */
50
51 static struct s3c24xx_led_platdata smdk_pdata_led4 = {
52 .gpio = S3C2410_GPB(5), //修改成S3C2410_GPB(5),以下依此修改6,8,10
53 .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
54 .name = "led4",
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 = "led5",
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 = "led6",
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 = "led7",
75 };
之后make编译,并下载到开发板。
三、开发板上测试
进入开发版,
可以看到led4~led7,其对应的是一个软连接,如图所示。
首先/sys 下的目录结构是经过精心设计的:在 /sys/devices 下是所有设备的真实对象,包括如视频卡和以太网卡等真实的设备,也包括 ACPI 等不那么显而易见的真实设备、还有 tty, bonding 等纯粹虚拟的设备;在其它目录如 class, bus 等中则在分类的目录中含有大量对 devices 中真实对象引用的符号链接文件。
Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。
其实,就是 在用户态可以通过对sys文件系统的访问,来看内核态的一些驱动或者设备等。
对于我们的LED,linux把他当作是直接挂在总线上的,我们可以直接通过/sys上操作对应文件而控制LED。
进入任意一个LED:
其中,操作brightness就可以控制灯的亮灭。如:echo 0 > brightness就是灭,1就是亮。max_brightness还可以调节亮度,最大值为255。