linux3.0-内核自带led驱动移植

**********************************************************************************************************************************************************************************

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驱动移植成功!









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值