fl2440使能linux-3.0内核自带的led驱动,并测试

来源:互联网 发布:淘宝店以开启,怎么找货 编辑:程序博客网 时间:2024/05/20 15:59

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到开发板上运行

可以成功运行了







原创粉丝点击