嵌入式Linux之我行——LED驱动在2440上的实例开发

发布者:q13358975046最新更新时间:2016-04-27 来源: eefocus关键字:Linux  LED驱动 手机看文章 扫描二维码
随时随地手机看文章
一、开发环境
  • 主  机:VMWare--Fedora 9
  • 开发板:Mini2440--64MB Nand
  • 编译器:arm-linux-gcc-4.3.2

二、实现步骤

1. 硬件原理图分析。由原理图得知LED电路是共阳极的,并分别由2440的GPB5、GPB6、GPB7、GPB8口控制的

嵌入式Linux之我行——LED驱动在2440上的实例开发 <wbr>转

2. 去掉内核已有的LED驱动设置,因为IO口与mini2440开发板的不一致,根本就不能控制板上的LED。

#gedit arch/arm/plat-s3c24xx/common-smdk.c    //注释掉以下内容

 


static struct platform_device __initdata *smdk_devs[] {
    &s3c_device_nand,
    
};


void __init smdk_machine_init(void)
{
    
    

    if (machine_is_smdk2443())
        smdk_nand_info.twrph0 50;

    s3c_device_nand.dev.platform_data &smdk_nand_info;

    platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));

    s3c_pm_init();
}


3. 编写适合mini2440开发板的LED驱动,代码如下,文件名称:my2440_leds.c



#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define DEVICE_NAME    "my2440_leds"    //设备名称
#define LED_MAJOR    231                //主设备号
#define LED_ON                        //LED亮状态
#define LED_OFF                       //LED灭状态

static unsigned long led_table[]      //控制LED的IO口
{
    S3C2410_GPB5,
    S3C2410_GPB6,
    S3C2410_GPB7,
    S3C2410_GPB8,
};

static unsigned int led_cfg_table[]   //LED IO口的模式
{
    S3C2410_GPB5_OUTP,
    S3C2410_GPB6_OUTP,
    S3C2410_GPB7_OUTP,
    S3C2410_GPB8_OUTP,
};

static int leds_open(struct inode *inode, struct file *file)
{
    return 0;
}

static int leds_ioctl(struct inode *inode, struct file *file,
                     unsigned int cmd, unsigned long arg)
{
    //检测是第几个LED,因开发板上只有4个,索引从0开始    
    if(arg || arg 3)
    {
        return -EINVAL;
    }

    //判断LED要执行哪种状态
    switch(cmd)
    {
        case LED_ON:
        {
            s3c2410_gpio_setpin(led_table[arg], ~(LED_ON));
            break;
        }
        case LED_OFF:
        {
            s3c2410_gpio_setpin(led_table[arg], ~(LED_OFF));
            break;
        }
        default:
        {
            return -EINVAL;
        }
    }

    return 0;
}

static struct file_operations leds_fops 
{
    .owner    THIS_MODULE,
    .open    leds_open,
    .ioctl    leds_ioctl,
};

static int __init led_init(void)
{
    int ret, i;

    for(i 0; 4; i++)
    {
        //初始化各IO口为输出模式
        s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

        //由原理图可知LED电路是共阳极的(即各IO口输出低电平0才会点亮)        
        //这里初始化为1,不让LED点亮
        s3c2410_gpio_setpin(led_table[i], ~(LED_OFF));
    }

    //注册LED设备为字符设备
    ret register_chrdev(LED_MAJOR, DEVICE_NAME, &leds_fops);

    if(ret 0)
    {
        printk(DEVICE_NAME " register falid!\n");
        return ret;
    }
}

static void __exit led_exit(void)
{
    //注销设备
    unregister_chrdev(LED_MAJOR, DEVICE_NAME);
}

module_init(led_init);
module_exit(led_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Huang Gang");
MODULE_DESCRIPTION("My2440 led driver");


4. 把LED驱动代码部署到内核中去

#cp -f my2440_leds.c /linux-2.6.30.4/drivers/char    //把驱动源码复制到内核驱动的字符设备下


#gedit /linux-2.6.30.4/drivers/char/Kconfig    //添加LED设备配置

config MY2440_LEDS
    tristate "My2440 Leds Device"
    depends on ARCH_S3C2440
    default y
    ---help---
      My2440 User Leds

 

#gedit /linux-2.6.30.4/drivers/char/Makefile    //添加LED设备配置

obj-$(CONFIG_MY2440_LEDS) += my2440_leds.o

 

5. 配置内核,选择LED设备选项

#make menuconfig

Device Drivers --->
    Character devices ---> 
        <*> My2440 Leds Device (NEW)


6. 编译内核并下载到开发板上,查看已加载的设备:#cat /proc/devices,可以看到my2440_leds的主设备号为231

嵌入式Linux之我行——LED驱动在2440上的实例开发 <wbr>转

7. 编写应用程序测试LED驱动,文件名:leds_test.c



#include 
#include 
#include 
#include 

int main(int argc, char **argv)
{
    int turn, index, fd;

    //检测输入的参数合法性
    if(argc != || sscanf(argv[2], "%d", &index) != || index || index 4)
    {
        printf("Usage: leds_test on|off 1|2|3|4\n");
        exit(1);
    }

    if(strcmp(argv[1], "on") == 0)
    {
        turn 1;
    }
    else if(strcmp(argv[1], "off") == 0)
    {
        turn 0;
    }
    else
    {
        printf("Usage: leds_test on|off 1|2|3|4\n");
        exit(1);
    }

    //打开LED设备
    fd open("/dev/my2440_leds", 0);

    if(fd 0)
    {
        printf("Open Led Device Faild!\n");
        exit(1);
    }

    //IO控制
    ioctl(fd, turn, index 1);

    //关闭LED设备
    close(fd);

    return 0;
}


8. 在开发主机上交叉编译测试应用程序,并复制到文件系统的/usr/sbin目录下,然后重新编译文件系统下载到开发板上

#arm-linux-gcc -o leds_test leds_test.c


9. 在开发板上的文件系统中创建一个LED设备的节点,然后运行测试程序,效果图如下,观测开发板上的LED灯,可以看到每一步的操作对应的LED会点亮或者熄灭

嵌入式Linux之我行——LED驱动在2440上的实例开发 <wbr>转

 

 

关键字:Linux  LED驱动 引用地址:嵌入式Linux之我行——LED驱动在2440上的实例开发

上一篇:嵌入式Linux之我行——LCD背光驱动在2440上的实例开发
下一篇:嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(五)

推荐阅读最新更新时间:2024-03-16 14:51

基于s3c2440的简易bootloader实现
一、目的 编写一个能够加载并启动OS内核的bootloader。 二、思路 第一阶段: (1)arm920t的异常向量表有两种存放方式,一种是低端存放(从0x00000000处开始存放),另一种是高端存放(从0xfff000000处开始存放)。选择低端存放,建立异常向量表。 (2)s3c2440的看门狗在上电启动时默认是开启的,所有要先把看门狗关了先。免得代码运行还没完成就强制复位。 (3)屏蔽掉所有中断。 (4)初始化时钟。 (5)初始化内存。 (6)清零bss段。 (7)设置好各个模式下的栈空间。 (8)重定位代码,使得代码的运行地址与链接地址相对应,之后就可以直接使用绝对地址。 (9)使用绝对跳转指令跳转到第二阶段,用
[单片机]
基于s3c<font color='red'>2440</font>的简易bootloader实现
S3C2440+嵌入式Linux的移动视频监控终端设计
随着人们对生活和工作环境的安全性的要求不断提高,安全防范的重要性越来越突出。视频监控技术在各个领域发挥着越来越重要的作用,比如对森林、旅游景点、城市小区等通过视频监控来实时监控现场发生的情况。将嵌入式技术和无线网络技术应用于视频监控终端,与传统的有线视频监控相比,无线视频监控摆脱了网络电缆的束缚,提高了视频监控的灵活性和可扩展性。监控人员可以携带手持监控设备而不必在固定位置值守来监控现场。 在无线网络环境下传输视频,庞大的视频信息量对有限的传输带宽是难以承受的,成为阻碍其应用的瓶颈之一,因此,需要高效率的视频压缩标准来满足无线传输带宽的需求。新一代视频压缩标准H.264是面向Internet和无线网络的视频图像编解码技术,它不
[单片机]
S3C<font color='red'>2440</font>+嵌入式<font color='red'>Linux</font>的移动视频监控终端设计
linux arm mmu基础
ARM MMU页表框架 先上一张arm mmu的页表结构的通用框图(以下的论述都由该图来逐渐展开): 以上是arm的页表框图的典型结构:即是二级页表结构: 其中第一级页表(L1)是由虚拟地址的高12bit(bits )组成,所以第一级页表有4096个item,每个item占4个字节,所以一级页表的大小为16KB,而在第一级页表中的每个entry的最低2bit可以用来区分具体是什么种类的页表项,2bit可以区分4种页表项,具体每种页表项的结构如下: 简而言之L1页表的页表项主要有两大类: 第一大类是指向第二级页表(L2页表)的基地址; 第二类直接指向1MB的物理内存。 在L1页表中每个表项可以覆盖1MB的内
[单片机]
<font color='red'>linux</font> arm mmu基础
基于嵌入式Linux的LCD背光调节及驱动实现
  在手持式设备中,液晶显示屏的使用越来越广泛。 由于LCD自身是不能发光的,它需要一个强劲的光源来给它提供背光,以便清晰地显示信息。这样的光源是非常耗电的,通常液晶显示屏的功耗常常占到系统总功耗的60%以上。以群创的7寸屏为例,通常背光灯的功耗为2.5W,而LCD的功耗只有0.825W。由此可见,背光光源的功耗在整个电源中的比重是相当高的。如果系统在不用显示屏时,也全功率的运行,系统的电池能量将很快被耗光。所以,调节LCD的背光源,降低系统在不用显示屏时的能耗是十分必要的工作。   另外,由于手持式设备工作环境的变化,也需要根据外界光线强度的变化,对背光的亮度做出相应的调节,以适合人眼观看的舒适度。   基于上述2种原因
[电源管理]
基于嵌入式<font color='red'>Linux</font>的LCD背光调节及驱动实现
linux UART串口驱动代分析
1、对UART驱动添加设备信息 对于2440的UART,内核已经对其完整的配置不需要做写入任何的代码, 这里要说明的是,在学习的裸机的时候,我们知道,UART相应的引脚可以配置称为红外IR,这里串口2就被配置成了红外驱动。 对于平台设备,首先要说明的应该是s3c2410_uartcfg结构体,该结构体定义在,Serial_s3c.h(includelinux)文件中 structs3c2410_uartcfg {undefined unsigned char hwport; /* 硬件端口编号比如UART0 UART1 等等*/ unsigned char unused; //
[单片机]
六 <font color='red'>linux</font> UART串口驱动代分析
S3C2440系统时钟讲解
FCLK - CPU HCLK- AHB总线 PCLK - APB总线 两个锁相环(PLL) MPLL- FCLK HCLK PCLK UPLL - USB(48M) 时钟来源 外部晶振- PLL- FCLK- HCLK- PCLK 必须先配置MPLLCON MPLL才会输出系统时钟 在软件重新配置PLLCON 寄存器之前系统时钟使用晶振时钟,即如果不配置PLLCON则系统时钟为晶振时钟(12M)(即上电后要想使用PLL放大晶振频率就要配置 MPLLCON) CLKDIVN寄存器中HDIVN和 PDIVN 决定FCLK HCLK PCLK之间的比例 HDIVN:1 PDIVN:1
[单片机]
Linux移动平台竞争态势
    尽管Android后来居上抢下全球7成以上的智慧型手机市场,但包括Tizen、Open webOS、Firefox OS及Sailfish OS等采用开放Linux架构的行动平台,仍不放弃庞大市场,且有志一同计划在2013年推出手机,不过,除了三星电子(Samsung Electronics)策略性投入Tizen之外,多数手机大厂仍无意从Android转台,对这些Linux行动平台仍采观望态度。 Firefox OS是由Mozilla基金会打造的全新平台,其余Linux平台多为旧瓶新装,Tizen与Sailfish OS同样源自于被诺基亚(Nokia)放弃的MeeGo平台,Open webOS则是源自于惠普(HP)收购自Pa
[手机便携]
基于Linux的串口服务器设计
随着互联网的迅猛发展,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集和控制设备也在逐步地走向网络化,以便共享网络资源。所以,在电子设备日趋网络化的今天,利用串口服务器来实现网络通信具有十分重要的意义。利用基于TCP/IP的串口数据流传输的实现来控制管理设备,无需投资大量的人力、物力即可完成对传统设备的管理、更换或者升级。 串口服务器的功能 串口服务器是一种通信协议转换器,它设有两类通信端口:一类是标准的RS232/422/485格式的串行端口,远程的RTU(远程终端设备)监控模块通过串行控制总线接入串口服务器的此类端口;另一类是以太网口,通过网线将串口服务器接入局域网的交换机等设备中。 串
[工业控制]
基于<font color='red'>Linux</font>的串口服务器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved