linux3.0-内核自带led驱动移植
**********************************************************************************************************************************************************************************
cpu ? ? ? ? ?: s3c2440(arm9)
linux內核:linux-3.0
開發板 ? ? :fl2440
開發模塊 :LED
************************************************************************************************************************************************************************************
前言:之前為了學習了解驅動的寫法,所以編寫與測試過led驅動,然而linux3.0的內核已經有了這個led驅動,所以我們只需要使能移植到我們的fl2440開發板上即可
1.源碼修改
查看fl2440開發板原理圖,可知4個led分別是連接GPB5,GPB6.GPB8.GPB10這四個管腳,如圖所示:
?
所以我們需要在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.
查看其中一個LED設備,如led1,可以看出led1當前的狀態是關閉。其中brightness就是控制等亮滅的文件,(0表示關閉,1表示打開)
max_brightness可以控制亮滅程度的最大值假如設定是50就是0到50代表不同的亮度
向brightness寫1,表示打開LED。這時led1會被點亮。
向brightness寫0,表示關閉LED。這時led1會被熄滅。
其他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;
}
將用交叉編譯器編譯之后下載到開發板上運行,
測試結果為:
四個led燈成功點亮與熄滅。led驅動移植成功!
總結
以上是生活随笔為你收集整理的linux3.0-内核自带led驱动移植的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试技术-易用性测试
- 下一篇: BCC异或校验 Linux C