LED的驱动程序很简单,按照张字符型设备驱动设计方法顺下来即可实现,这里主要讲几个注意事项。
  一、在linux系统中,操作硬件不能够使用物理地址,一定要用虚拟地址。将物理地址转化为虚拟地址的函数如下:
    #define    ioremap(cookie,size)
    其中cookie为要转化的物理地址,size为转化空间的大小,单位为字节。返回值为转化后的虚拟地址。
  二、在执行程序时我们需要顺带输入参数进去,但是是以字符串的形式输入的,不方便操控。所以用atoi函数将字符串转化为整数,函数原型如下:
    int    atoi(const char *nptr);
  三、点亮LED是对设备的控制,而不是读写。即在驱动程序中ioctl函数里相对应的寄存器的虚拟地址写入值即可。向某个地址写入值的函数为writel函数,原型:
    static    inline    void    writel(unsigned int b, volatile void __iomem *addr)
    第一个参数为写入的值,第二个参数是虚拟地址。
  接下来也没什么了,最关键的就是驱动程序模型。要想写出字符设备驱动一定要学好它,特别重要!!

头文件:

 #include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/io.h> #define LED_MAGIC 'L'
#define LED_OFF _IO(LED_MAGIC,0)
#define LED_1 _IO(LED_MAGIC,1)
#define LED_2 _IO(LED_MAGIC,2)
#define LED_3 _IO(LED_MAGIC,3)
#define LED_4 _IO(LED_MAGIC,4)
#define LED_ALL _IO(LED_MAGIC,5)

驱动程序代码:

  

 #include "led.h"

 #define GPBCON 0x56000010
#define GPBDAT 0x56000014 /*控制LED寄存器的物理地址*/
unsigned int *led_config;
unsigned int *led_data; /*存储设备号*/
dev_t devno; /*分配cdev*/
struct cdev cdev; int led_open(struct inode *node, struct file *filp)
{
/*将物理地址转为虚拟地址*/
led_config = ioremap(GPBCON,);
led_data = ioremap(GPBDAT,); /*向某一地址写入值*/
writel(0x15400,led_config); return ;
}
/*驱动程序里的设备控制函数*/
long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch(cmd)
{
case LED_1:
writel(0b00011100000,led_data);
return ;
case LED_2:
writel(0b00101100000,led_data);
return ;
case LED_3:
writel(0b00110100000,led_data);
return ;
case LED_4:
writel(0b00111000000,led_data);
return ;
case LED_OFF:
writel(0b00111100000,led_data);
return ;
case LED_ALL:
writel(,led_data);
return ; default:
return -EINVAL;
}
} /*函数映射关系表*/
struct file_operations led_fops =
{
.open = led_open,
.unlocked_ioctl = led_ioctl,
}; static int led_init()
{ /*初始化cdev*/
cdev_init(&cdev, &led_fops);
/*注册cdev*/
alloc_chrdev_region(&devno, , ,"myled"); //动态分配设备号,第四个参数为设备名称
cdev_add(&cdev, devno, );
return ;
} static void led_exit()
{
/*删除设备*/
cdev_del(&cdev);
/*释放设备号*/
unregister_chrdev_region(devno,);
} MODULE_LICENSE("GPL");
module_init(led_init);
module_exit(led_exit);

应用程序代码:

 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include "led.h" int main(int argc, char *argv[])
{
int fd;
int cmd; if (argc < )
{
printf("please enter the second para!\n");
return ;
} cmd = atoi(argv[]); fd = open("/dev/myled",O_RDWR); if(cmd == )
ioctl(fd,LED_OFF);
if(cmd == )
ioctl(fd,LED_1);
if(cmd == )
ioctl(fd,LED_2);
if(cmd == )
ioctl(fd,LED_3);
if(cmd == )
ioctl(fd,LED_4);
if(cmd == )
ioctl(fd,LED_ALL); return ;
}

led驱动程序设计的更多相关文章

  1. [国嵌攻略][117][LED驱动程序设计]

    LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko ... ...

  2. 简单的led驱动程序设计

    基于ok6410: led驱动程序: vim led.c #include<linux/kernel.h>#include<linux/module.h>#include< ...

  3. Mini2440 LED驱动程序设计

    1 LED初始化: 2 LED闪烁设计 位或操作:| 取反操作:~ 位与操作:& http://www.tuicool.com/articles/eQzEJv

  4. ARM学习笔记13——LED驱动程序设计

    首先我们要根据开发板原理图得到控制LED灯的引脚是哪个,我们现在以LED1为例,我们已经知道LED1由S5PV210的GPC1_3控制,因此我们按如下步骤进行: 第一步是配制S5PV210的GPC1_ ...

  5. s3c6410开发板LED驱动程序设计详细…

    2 下面来看看tiny6410关于LED的原理图如图(1)所示: 图1    LED原理图 3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c ...

  6. 兼容可控硅调光的一款LED驱动电路记录

    1.该款电路为兼容可控硅调光的LED驱动电路,采用OB3332为开关控制IC,拓扑方案为Buck: 2.FB1:磁珠的单位是欧姆,而不是亨利,这一点要特别注意.因为磁珠的单位是按照它在某一频率 产生的 ...

  7. 20145316&20145229实验四:驱动程序设计

    20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...

  8. linux驱动程序设计的硬件基础,王明学learn

    linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...

  9. FL2440驱动添加(4)LED 驱动添加

    硬件信息:FL2440板子,s3c2440CPU带四个LED,分别在链接GPB5,GPB6,GPB8,GPB10 内核版本:linux-3.8.0 led驱动代码如下: 值得注意地方地方: 1,定时器 ...

随机推荐

  1. Bloom Filter概念和原理

    Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某 ...

  2. [置顶] flex4事件监听与自定义事件分发(三)

    1.我们来说一下自定义事件子类.什么时候创建新的事件类以及怎么创建. (1)说一下,我们什么时候需要自定义事件类.举例说明,在flex中事件的基类是Event,而当我们点击某个按钮或者是单击某个组件的 ...

  3. 大数据笔记04:大数据之Hadoop的HDFS(基本概念)

    1.HDFS是什么? Hadoop分布式文件系统(HDFS),被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点. 2.HDFS ...

  4. Counting Lines, Words, and Characters with wc

      Counting Lines, Words, and Characters with wc   When working with text files, you sometimes get a ...

  5. sql server 性能计数器

    常规计数器 收集操作系统服务器的服务器性能信息,包括Processor.磁盘.网络.内存 Processor 处理器 1.1 % Processor Time指处理器用来执行非闲置线程时间的百分比.通 ...

  6. ajax与Servlet

    1.后台返回text类型的数据 <%@ page language="java" import="java.util.*" pageEncoding=&q ...

  7. cogs 1008 贪婪大陆

    /* 不要思维定视 盯着线段树维护l r 的ans不放 显然没法区间合并 换一种思路 如果打暴力的话 O(nm) 每次询问 扫一遍之前所有的修改 有交点则说明种数++ 接下来考虑如何优化 我们把每个区 ...

  8. Namespace declaration statement has to be the very first

    Namespace declaration statement has to be the very first statement in the script 我新建了一个Homea模块,并把Hom ...

  9. 《CSS网站布局实录》学习笔记(二)

    第二章 XHTML与CSS基础 2.1 XHTML基础 XHTML是网页代码的核心内容,标准XHTML代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  10. POP动画引擎中Layer与CALayer的一点区别

    POP动画引擎是facebook提供的一个开源框架, 可以实现很多的动画效果, 这里就不一一介绍啦, 有兴趣的童鞋请移步: https://github.com/facebook/pop 下面简单的讲 ...