FL2440添加自带led驱动
在之前学习驱动自己写过led的驱动程序,其实s3c2440对于驱动已经支持得非常好,内核里面已经有了led的驱动程序,我们要使能led驱动只需要稍作修改。
make menuconfig 配置
Device Drivers --->
[*] LED Support --->
[*] LED Class Support
<*> LED Support for Samsung S3C24XX GPIO LEDs//添加LED支持
源码修改
s3c24xx系列的芯片的led硬件信息基本一致,因此内核将led的硬件设备信息源码放在了 arch/arm/plat-s3c24xx/common-smdk.c,对照芯片手册,我们要把led0~led3的相关GPIO分别配置成PB5,PB6,PB8,PB10
vim arch/arm/plat-s3c24xx/common-smdk.c
/* LED devices */
static struct s3c24xx_led_platdata smdk_pdata_led4 = {
.gpio = S3C2410_GPB(5),/*led0为PB5*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led0",
.def_trigger = "timer",
};
static struct s3c24xx_led_platdata smdk_pdata_led5 = {
.gpio = S3C2410_GPB(6),/*led1为PB6*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led1",
.def_trigger = "nand-disk",
};
static struct s3c24xx_led_platdata smdk_pdata_led6 = {
gpio = S3C2410_GPB(8),/*led2为PB8*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led2",
};
static struct s3c24xx_led_platdata smdk_pdata_led7 = {
.gpio = S3C2410_GPB(10),/*led3为PB10*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led3",
};
完成以上操作之后重新编译内核并且下载到开发板。
测试运行
对于向led这样的设备模型,系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件。
下载到内核之后会在/sys/class/目录下生成leds目录,会看到led0 led1 led2 led3,在leds目录下执行ls -l 可知,led0、led1 、led2、 led3都是软连接
进入到led0目录下,可以看到brightness 等文件
其中brightness就是控制等亮灭的文件,max_brightness可以控制亮灭程度的最大值假如设定是100就是0到100代表不同的亮度(需要单板硬件的支持)。
- 向brightness文件中写入1控制灯亮
- 向brightness文件中写入0控制灯亮
cat > brightness //向brightness写入数据
可以看到,写入1时,led0点亮;写入0时,led0熄灭。对于其他的led灯也是同样的操作。