linux3.0-内核自带led驱动移植
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 /IT之家 LED devices IT之家/
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 /IT之家 Configure the LEDs (even if we have no LED support)IT之家/
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-->
[IT之家]LED support-->
[IT之家]LED Class support
<IT之家>LED Support for Samsung S3C24XX GPIO LEDs /IT之家添加led支持IT之家/
完成上面的操作之后重新编译内核然后烧录到开发板,运行
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
/IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家
IT之家 Copyright: (C) 2017 zoulei
IT之家 All rights reserved.
IT之家
IT之家 Filename: led.c
IT之家 Description: This file
IT之家
IT之家 Version: 1.0.0(2017年04月20日)
IT之家 Author: zoulei <[email protected]>
IT之家 ChangeLog: 1, Release initial version on "2017年04月20日 06时19分52秒"
IT之家
IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家/
#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 IT之家argv[])
{
int fd, no;
no=(int)argv[1][3]-48; /IT之家这么做的目的是得到运行./led_test led1(led2,led3,led4)on 命令时中的第二个参数中的数字1,2,3,4IT之家/
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;
}
/IT之家完成打开或关闭LED操作IT之家/
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驱动移植成功!
相关热词: Linux
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/server/kaifa/8400.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
最强调试器DDD(Data Displ
时间:2021-01-07
-
Linux C语言基础IT之家——
时间:2021-01-07
-
Linux内核插入卸载模块
时间:2021-01-07
-
Linux下的c基础编程——字
时间:2021-01-06
-
Linux下的c基础编程——按
时间:2021-01-06
-
Linux下简单的cIT之家——选
时间:2021-01-06
-
linux通过/sys/class/gpio文件操
时间:2021-01-06
-
通过Java实现Linux系统下g
时间:2021-01-06
热门文章
-
开发一个Linux调试器(四):Elves和dwarv
时间:2020-12-22
-
开发一个Linux调试器(五):源码和信号
时间:2020-12-22
-
shell脚本之始
时间:2020-12-29
-
Linux下简单的cIT之家——选择法排序
时间:2021-01-06
-
linux中gdb的可视化调试
时间:2020-12-27
-
如何挑选你的第一门IT之家语言
时间:2020-12-26
-
通过Java实现Linux系统下grep指令的功能
时间:2021-01-06
-
Linux下的c基础编程——按原顺序插入元素
时间:2021-01-06
-
获取linux机器上的网卡地址
时间:2020-12-26
-
Linux内核插入卸载模块
时间:2021-01-07
