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

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

可以成功运行了







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值