基于S3C2440的linux-3.6.6移植——LED驱动

发布者:温暖梦想最新更新时间:2024-08-09 来源: cnblogs关键字:S3C2440  6  移植  LED驱动 手机看文章 扫描二维码
随时随地手机看文章

目前的linux版本的许多驱动都是基于设备模型,LED也不例外。

 

简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件。

 

对于基于s3c2440的开发板来说,linux-3.6.6自动的LED驱动只需改变连接LED的IO端口,及高、低电平响应即可。我的开发板的四个LED连接在了B口的5到8引脚上,当输出低电平时被点亮,与linux自带的LED驱动一致,因此无需做任何改动。

 

使用menuconfig来配置内核,这里要加上对LED模块的内容,即:

Device Drivers--->

       [*]LED Support--->

              <*>LED Class Support

              <*>LED Support for Samsung S3C24xx GPIO LEDs

编译内核,并把编译好的内核下载到开发板上,运行:

[root@zhaocj /]#ls

bin      etc     lib      proc     sys      usr

dev      home    linuxrc  sbin     temp

[root@zhaocj /]#cd sys

[root@zhaocj /sys]#ls

block     class    devices   fs        module

bus       dev      firmware  kernel    power

进入sys目录下,我们看到该目录下有一些子目录。

[root@zhaocj /sys]#cd class

[root@zhaocj class]#ls

backlight     hidraw       leds          rtc          vc

bdi          hwmon         mem           sound        video_output

block         i2c-adapter   misc         spi_master    vtconsole

firmware      i2c-dev       mmc_host     spidev        watchdog

gpio         input         mtd          tty

graphics      lcd          net           udc

进入class目录,我们会看到在该目录下有一些设备,其中leds就是本次我们要操作的LED。

[root@zhaocj class]#cd leds

[root@zhaocj leds]#ls

backlight  led1      led2       led3       led4

在leds目录下,会看到四个LED的目录,这就是开发板上的四个LED。另外backlight目录是关于LCD的背光,与LED无关。

[root@zhaocj leds]#cd led1

[root@zhaocj led1]#ls

brightness     max_brightness  subsystem

device         power           uevent

brightness文件就是LED设备,对其进行操作就可完成对LED的控制。

[root@zhaocj led1]#cat brightness

0

可以看出led1当前的状态是关闭。(0表示关闭,1表示打开)

[root@zhaocj led1]#cat >brightness<> 1

> eof

#[root@zhaocj led1]#

向brightness写1,表示打开LED。这时led1会被点亮。

 

当然,我们也可以编写用户程序来控制开发板上的四个LED

/**********************

****leds.c**************

**********************/

#include

#include

#include

#include

#include

#include

#include

 

int main(int argc, char *argv[])

{

  int fd, no;

/*判断是要控制哪个LED,并打开相应的文件*/

 no=(int)argv[1][3]-48;

 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;

}

 

 

上面的程序只做简单测试之用。编译该文件:

arm-linux-gcc  -o  leds  leds.c

把leds文件下载到temp目录下,运行:

[root@zhaocj /temp]# ./leds  led2  on

则点亮led2。

[root@zhaocj /temp]# ./leds  led2  off

则关闭led2。

 

下面我就来简单分析一下linux自带的LED子系统。

在mach-zhaocj2440.c文件,创建了LED设备,如下:

/* LEDS */

 

static struct s3c24xx_led_platdata zhaocj2440_led1_pdata = {

       .name             = 'led1',

       .gpio              = S3C2410_GPB(5),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = 'heartbeat',

};

 

static struct s3c24xx_led_platdata zhaocj2440_led2_pdata = {

       .name             = 'led2',

       .gpio              = S3C2410_GPB(6),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = 'nand-disk',

};

 

static struct s3c24xx_led_platdata zhaocj2440_led3_pdata = {

       .name             = 'led3',

       .gpio              = S3C2410_GPB(7),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = 'mmc0',

};

 

static struct s3c24xx_led_platdata zhaocj2440_led4_pdata = {

       .name             = 'led4',

       .gpio              = S3C2410_GPB(8),

       .flags             = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,

       .def_trigger    = '',

};

定义了四个LED数据,名字分别为led1~led4,这就是我们在leds目录下看到这四个子目录。它们所连接的引脚分别为B口的5~8,这是由S3C2410_GPB()宏定义完成的。标识S3C24XX_LEDF_ACTLOW表示的是低电平有效,S3C24XX_LEDF_TRISTATE表示的三态无效。另外def_trigger表示的是触发控制,如我们对nand进行读写操作时,led2会不停的闪,在这里我们没有用到这个功能,暂时不用理会。

 

static struct platform_device zhaocj2440_led1= {

       .name             = 's3c24xx_led',

       .id          = 1,

       .dev        = {

              .platform_data       = &zhaocj2440_led1_pdata,

       },

};

 

static struct platform_device zhaocj2440_led2= {

       .name             = 's3c24xx_led',

       .id          = 2,

       .dev        = {

              .platform_data       = &zhaocj2440_led2_pdata,

       },

};

 

static struct platform_device zhaocj2440_led3= {

       .name             = 's3c24xx_led',

       .id          = 3,

       .dev        = {

              .platform_data       = &zhaocj2440_led3_pdata,

       },

};

 

static struct platform_device zhaocj2440_led4= {

       .name             = 's3c24xx_led',

       .id          = 4,

       .dev        = {

              .platform_data       = &zhaocj2440_led4_pdata,

       },

};

上面则创建了总线平台设备,四个LED的设备名称都是s3c24xx_led,子设备id分别从1到4,设备数据则是上面定义的四个LED数据。然后把这四个LED设备再添加到开发板的设备数组中,即:

static struct platform_device *zhaocj2440_devices[]__initdata = {

……

       &zhaocj2440_led1,

       &zhaocj2440_led2,

       &zhaocj2440_led3,

       &zhaocj2440_led4,

……

};

最后,在开发板系统初始化过程中,再把设备数组中的设备逐一注册到系统总线上,即:

static void __init zhaocj2440_init(void)

{

……

platform_add_devices(zhaocj2440_devices,ARRAY_SIZE(zhaocj2440_devices));

……

}

这样就完成了LED设备的创建。

 

光有设备还不能工作,任何一个设备的运行还需要与之相对应的驱动。对于基于s3c24xx的LED来说,它的驱动是在drivers/leds目录下Leds-s3c24xx.c文件内创建的,即:

static struct platform_driver s3c24xx_led_driver = {

       .probe            = s3c24xx_led_probe,

       .remove          = s3c24xx_led_remove,

       .driver            = {

[1] [2]
关键字:S3C2440  6  移植  LED驱动 引用地址:基于S3C2440的linux-3.6.6移植——LED驱动

上一篇:LCD驱动移植在在mini2440(linux2.6.29)和FS4412(linux3.14.78)上实现对比(deep dive)
下一篇:Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解

推荐阅读最新更新时间:2026-03-25 15:07

基于S3C2440的linux-3.6.6移植——LED驱动
目前的linux版本的许多驱动都是基于设备模型,LED也不例外。 简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件。 对于基于s3c2440的开发板来说,linux-3.6.6自动的LED驱动只需改变连接LED的IO端口,及高、低电平响应即可。我的开发板的四个LED连接在了B口的5到8引脚上,当输出低电平时被点亮,与linux自带的LED驱动一致,因此无需做任何改动。
[单片机]
S3C2440 字符设备驱动程序之LED驱动程序_编写编译(二)
app: open , read , write 驱动: led_open,led_read,led_write 驱动框架: 一、写出:led_open,led_read 二、怎么告诉内核? a、定义一个file_operations b、把这个结构体告诉内核: register_chrdev(major,name,file_operations) c、谁来调用它 (register_chrdev) 驱动的入口函数 first_drv_init d、修饰:module_init(first_drv_init) (怎么知道是哪个入口函数) module_init:(入口函数)定义了
[单片机]
<font color='red'>S3C2440</font> 字符设备驱动程序之<font color='red'>LED驱动</font>程序_编写编译(二)
S3C2440 LED驱动
//头文件 #include linux/miscdevice.h #include linux/delay.h #include asm/irq.h #include mach/regs-gpio.h #include mach/hardware.h #include linux/kernel.h #include linux/module.h #include linux/init.h #include linux/mm.h #include linux/fs.h #include linux/types.h #include linux/delay.h #include linux/moduleparam.h #includ
[单片机]
uboot在s3c2440上的移植(3)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持)。 目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了。 首先,在include/configs/my2440.h头文件中定义Nand要用到的宏和寄存器,如下: #gedit in
[单片机]
uboot在<font color='red'>s3c2440</font>上的<font color='red'>移植</font>(3)
基于S3C2440的LWIP-1.3.0和DM9000在UCOS-II-2.8.6上的移植
经常在Linux上跑,一时间跳到UCOS,感觉有点不习惯。首先是编译器,GCC是个不错的选择,但GDB调试太麻烦。ADS和仿真器结合是个十分不错的调试环境,于是,将代码就搬到ADS上,这下完全脱离Linux,整个开发过程都在Windows进行。其实是UCOS太简洁了,时钟、接口很多都需要自己开发…小弟对UCOS不是很熟,下面是移植过程的一些小结,希望对有需要的朋友带来些帮助。关于UCOS在S3C2440上的移植,可以参考《uCOS-II在S3C2440上的移植》一文。 1. 寻找最新代码,总结前辈经验,就是下载LWIP的源代码和Michael Anburaj基于S3C2410的移植版。 http://download.savann
[单片机]
基于<font color='red'>S3C2440</font>的LWIP-1.3.0和DM9000在UCOS-II-2.8.6上的<font color='red'>移植</font>
郭天祥-S3C2440开发板Linux2.6.31移植教程
本人使用的开发板是广州天嵌的TQ2440开发板 最近使用了郭天祥的教程学习S3C2440嵌入式linux2.6.31系统移植,移植yaffs2文件系统成功后,发现开发板移植的系统的ping命令无法ping通电脑。后面通过烧录开发板自带的linux镜像文件和yaffs2文件系统,对比之后。发现本人的笔记本(联想G40系列),如果只接通过本地网卡与开发板直连,无法ping通,但是使用自己的台式电脑,可以使用网线直连开发板ping通,确认了问题的原因是: 1.笔记本在网线直连开发板的情况下,无法ping通开发板。 2.个人移植的linux 2.6.31操作系统驱动存在问题。 第一个问题很好解决,如果要继续
[单片机]
linux 2.6.32 在arm9(s3c2440)平台的移植2 -- Kconfig和Makefile
在ubuntu上按照无数帖子无数文档搞了半天qt环境还有eclipse,最后才发现这些都是无关紧要的东西,首先能在ARM核心板上移植linux才是应该先实现的,自己瞎搞了半天移植,对着make menuconfig的复杂树型选项和添加代码迷糊不已,到了晚上下班才猛然醒悟一切都是因为自己kconfig和makefile的关系不明白,才在原地犯迷糊的。 自己的理解 + 网摘, 参考: http://www.cnblogs.com/sirsunny/archive/2004/12/15/77506.html http://blog.csdn.net/windriver_hf/archive/2010/04/16/5493622.as
[单片机]
linux 2.6.32 在arm9(s3c2440)平台的移植 - 标题要长(2)
(1) s3c2440平台关于nand flash部分的代码, 在你弄清楚移植代码的每一个步骤是为什么之前,不要去做所谓的移植,那是毫无意义的 *****/arch/arm/plat-s3c24xx/common-smdk.c***** static struct mtd_partition smdk_default_nand_part = { = { .name = supervivi , .size = 0x00040000, .offset = 0, }, = { .name =
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved