红联Linux门户
Linux帮助

linux3.0-内核自带led驱动移植

发布时间:2017-06-08 11:16:56来源:linux网站作者:zouleideboke
cpu: s3c2440(arm9)
Linux内核:linux-3.0
开发板:fl2440
开发模块:LED
 
前言:之前为了学习了解驱动的写法,所以编写与测试过led驱动,然而linux3.0的内核已经有了这个led驱动,所以我们只需要使能移植到我们的fl2440开发板上即可
 
1.源码修改
查看fl2440开发板原理图,可知4个led分别是连接GPB5,GPB6.GPB8.GPB10这四个管脚,如图所示:
linux3.0-内核自带led驱动移植
所以我们需要在arch/arm/plat-s3c24xx/common-smdk.c文件中稍作修改,将led0~led3的相关GPIO分别配置成PB5,PB6,PB8,PB10
[zoulei@CentOS linux-3.0]$ vim arch/arm/plat-s3c24xx/common-smdk.c
48   
49 /* LED devices */  
50   
51 static struct s3c24xx_led_platdata smdk_pdata_led1 = {  
52         .gpio           = S3C2410_GPB(5),  
53         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  
54         .name           = "led1",  
55         .def_trigger    = "timer",  
56 };  
57   
58 static struct s3c24xx_led_platdata smdk_pdata_led2 = {  
59         .gpio           = S3C2410_GPB(6),  
60         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  
61         .name           = "led2",  
62         .def_trigger    = "nand-disk",  
63 };  
64   
65 static struct s3c24xx_led_platdata smdk_pdata_led3 = {  
66         .gpio           = S3C2410_GPB(8),  
67         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  
68         .name           = "led3",  
69 };  
70   
71 static struct s3c24xx_led_platdata smdk_pdata_led4 = {  
72         .gpio           = S3C2410_GPB(10),  
73         .flags          = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,  
74         .name           = "led4",  
75 };
#############################  
177   
178 void __init smdk_machine_init(void)  
179 {  
180         /* Configure the LEDs (even if we have no LED support)*/  
181   
182         s3c_gpio_cfgpin(S3C2410_GPB(5), S3C2410_GPIO_OUTPUT);  
183         s3c_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT);  
184         s3c_gpio_cfgpin(S3C2410_GPB(8), S3C2410_GPIO_OUTPUT);  
185         s3c_gpio_cfgpin(S3C2410_GPB(10), S3C2410_GPIO_OUTPUT);  
186   
187         s3c2410_gpio_setpin(S3C2410_GPB(5), 1);  
188         s3c2410_gpio_setpin(S3C2410_GPB(6), 1);  
189         s3c2410_gpio_setpin(S3C2410_GPB(8), 1);  
190         s3c2410_gpio_setpin(S3C2410_GPB(10), 1);
 
2.make menuconfig配置
[zoulei@CentOS linux-3.0]$ make menuconfig
Device drivers-->  
[*]LED support-->  
[*]LED Class support  
<*>LED Support for Samsung S3C24XX GPIO LEDs /*添加led支持*/
完成上面的操作之后重新编译内核然后烧录到开发板,运行
 
3.下载到开发板测试
下载到内核之后会在/sys/class/目录下生成leds目录,在leds目录下会看到led0 led1 led2 led3四个LED的目录,这就是开发板上的四个LED.
linux3.0-内核自带led驱动移植
查看其中一个LED设备,如led1,可以看出led1当前的状态是关闭。其中brightness就是控制等亮灭的文件,(0表示关闭,1表示打开)
max_brightness可以控制亮灭程度的最大值假如设定是50就是0到50代表不同的亮度
linux3.0-内核自带led驱动移植
向brightness写1,表示打开LED。这时led1会被点亮。
向brightness写0,表示关闭LED。这时led1会被熄灭。
linux3.0-内核自带led驱动移植
其他led也是同样的操作!
 
说明:对于向led这样的设备模型,系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在Linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件
 
代码测试:
led.c                                                                                                                      
/*************************************************** 
*      Copyright:  (C) 2017 zoulei 
*                  All rights reserved. 
*       Filename:  led.c 
*    Description:  This file  
*                  
*        Version:  1.0.0(2017年04月20日) 
*         Author:  zoulei <zoulei121@gmail.com> 
*      ChangeLog:  1, Release initial version on "2017年04月20日 06时19分52秒" 
*                  
***************************************************/  
#include<stdint.h>  
#include<string.h>  
#include<fcntl.h>  
#include<unistd.h>  
#include<stdio.h>  
#include<linux/input.h>  
#include<unistd.h>  
int main(int argc, char *argv[])  
{  
int fd, no;  
no=(int)argv[1][3]-48;  /*这么做的目的是得到运行./led_test led1(led2,led3,led4)on 命令时中的第二个参数中的数字1,2,3,4*/  
switch(no)  
{  
case 1:  
fd = open("/sys/class/leds/led1/brightness", O_RDWR);  
break;  
case 2:  
fd = open("/sys/class/leds/led2/brightness", O_RDWR);  
break;  
case 3:  
fd = open("/sys/class/leds/led3/brightness", O_RDWR);  
break;  
case 4:  
fd = open("/sys/class/leds/led4/brightness", O_RDWR);  
break;  
default:  
return -1;  
}  
if(fd<0)  
{  
printf("can not open file.\n");  
return -1;  
}  
/*完成打开或关闭LED操作*/  
if(!strcmp(argv[2],"on"))  
write(fd, "1", 1);  
else if(!strcmp(argv[2],"off"))  
write(fd, "0", 1);  
close(fd);  
return 0;  
}  
 
将用交叉编译器编译之后下载到开发板上运行。
测试结果为:
linux3.0-内核自带led驱动移植
四个led灯成功点亮与熄灭。led驱动移植成功!
 
本文永久更新地址:http://www.linuxdiyf.com/linux/31338.html