linux3.0-内核自带led驱动移植
来源:互联网 发布:中国电信2g网络制式 编辑:程序博客网 时间:2024/04/27 23:39
**********************************************************************************************************************************************************************************
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驱动移植
- 内核自带LED驱动移植
- sc32440 内核自带LED驱动
- tiny4412内核自带led驱动分析
- 05-S3C2440学习之内核(移植)linux3.4.2移植(4)支持LED驱动、按键驱动
- linux3.0内核中如何取消本身自带的按键驱动
- fl2440内核自带的LED驱动修改与使用
- 将LED驱动模块编译到Linux3.10.17内核
- Linux4.3.2内核自带LCD驱动移植
- fl2440内核自带按键驱动移植及hexdump命令
- linux3.1.8内核移植到gt2440---CS8900A驱动移植
- linux3.0内核移植问题记录
- 【FL2400】Linux3.0 内核移植 一
- linux3.0内核移植(S3C2440)
- 基于arm9的linux3.0内核移植
- 做linux3.0版内核移植总结。
- Linux3.4内核Nand Flash驱动的移植
- Linux3.4内核Nand Flash驱动的移植
- 通过ID获取元素
- 堆和栈
- linux shell:[0] &&和||使用方法
- GeoServer安装遇到的问题
- apue第八章 进程控制(2)
- linux3.0-内核自带led驱动移植
- android线程通讯(Handler)
- 多线程中run()和start()的区别
- 0509
- 百度2017春招笔试真题编程题集合-3
- leetcode题解-55. Jump Game && 56. Merge Intervals
- poj 2677 双调欧几里得 dp
- hadoop之远程debug
- 58. Length of Last Word