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. Android 基础组件

    基础组件 所有的控件都可以在java代码中创建出来,并且大部分的属性都对应set和get方法,比如 View view = new View(Context context)  context是上下文 ...

  2. JMeter在里面Json数据处理方法

    http://eclipsesource.com/blogs/2014/06/12/parsing-json-responses-with-jmeter/ Json作为一种数据交换格式在网络开发.特别 ...

  3. Android 监控网络状态

    public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...

  4. Bottle 中文文档

    译者: smallfish (smallfish.xy@gmail.com) 更新日期: 2009-09-25 原文地址: http://bottle.paws.de/page/docs (已失效) ...

  5. android studio 的部分设置

    1.android studio 如何提示方法的用法 在 Eclipse中鼠标放上去就可以提示方法的用法,实际上Android Studio也可以设置的.如图 Preferences > Edi ...

  6. 通用对象转换Json格式

    public static string ObjectToJson<T>(IList<T> IL, params string[] args) { var Json = new ...

  7. ASP.NET-FineUI开发实践-9(四)

    现在是这么个问题,在开发中表格是动态出来的,就是标准板是全部字段列出,客户要根据情况列出自己想要的,在增加操作页面的同时要是能用前台自带的功能直接保存到后台就好了,现在的列显示和隐藏是不回发的. 1. ...

  8. WinHeap.H

    网上找到的,对 Windows Heap 有详细的定义. // file winheap.h typedef void VOID; typedef unsigned __int8 UINT8; typ ...

  9. sql server根据日期或者月份查询聚合数据

    /*****************************根据时间查询每天的数据***************************************/ @tm_start:开始时间 @tm ...

  10. div 固定宽高 水平垂直居中方法

    div固定宽高,水平垂直居中,根据所用单位不同,分成两种情况,分别是"px"和"%"情况. 例:将三层div做出三个边框,要求水平垂直居中.效果如图 情况一(单 ...