linux-3.0版本内核自带有led的驱动,需要启用首先要配置内核的make menuconfig,
Device drivers-->
[*]LED support-->
[*]LED Class support
<*>LED Support for Samsung S3C24XX GPIO LEDs /*添加led支持*/
之后需要修改一下内核led的设备代码。
根据fl2440底板原理图可以知道
led管脚分别是GPB5,6,8,10,修改设备代码,打开 vim arch/arm/plat-s3c24xx/common-smdk.c
/* LED devices */
static struct s3c24xx_led_platdata smdk_pdata_led4 = {
.gpio = S3C2410_GPB(5),
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led1",
.def_trigger = "timer",
};
static struct s3c24xx_led_platdata smdk_pdata_led5 = {
.gpio = S3C2410_GPB(6),
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led2",
.def_trigger = "nand-disk",
};
static struct s3c24xx_led_platdata smdk_pdata_led6 = {
.gpio = S3C2410_GPB(8),
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led3",
};
static struct s3c24xx_led_platdata smdk_pdata_led7 = {
.gpio = S3C2410_GPB(10),
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led4",
};
void __init smdk_machine_init(void)
{
/* Configure the LEDs (even if we have no LED support)*/
s3c_gpio_cfgpin(S3C2410_GPB(5), S3C2410_GPIO_OUTPUT);
s3c_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT);
s3c_gpio_cfgpin(S3C2410_GPB(8), S3C2410_GPIO_OUTPUT);
s3c_gpio_cfgpin(S3C2410_GPB(10), S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPB(5), 1);
s3c2410_gpio_setpin(S3C2410_GPB(6), 1);
s3c2410_gpio_setpin(S3C2410_GPB(8), 1);
s3c2410_gpio_setpin(S3C2410_GPB(10), 1);
配置好之后,编译内核,烧录运行,
在如图路径下有四个led文件,cat其中一个后,内容是0,此时是关闭,向里面写1则亮,写0则灭,其它led也是这么操作的。
对于led这样的设备模型,系统认为所有的设备都是挂接在总线(platform)上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在Linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件
测试代码
/*********************************************************************************
* Copyright: (C) 2017 ZhangYan<zhangyan@emaill.com>
* All rights reserved.
*
* Filename: test_led_kernelown.c
* Description: This file
*
* Version: 1.0.0(2017年09月12日)
* Author: ZhangYan <zhangyan@emaill.com>
* ChangeLog: 1, Release initial version on "2017年09月12日 20时16分02秒"
*
********************************************************************************/
#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;
}
编译后,tftp到开发板上运行
可以成功运行了