led驱动程序设计
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驱动程序设计的更多相关文章
- [国嵌攻略][117][LED驱动程序设计]
LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko ... ...
- 简单的led驱动程序设计
基于ok6410: led驱动程序: vim led.c #include<linux/kernel.h>#include<linux/module.h>#include< ...
- Mini2440 LED驱动程序设计
1 LED初始化: 2 LED闪烁设计 位或操作:| 取反操作:~ 位与操作:& http://www.tuicool.com/articles/eQzEJv
- ARM学习笔记13——LED驱动程序设计
首先我们要根据开发板原理图得到控制LED灯的引脚是哪个,我们现在以LED1为例,我们已经知道LED1由S5PV210的GPC1_3控制,因此我们按如下步骤进行: 第一步是配制S5PV210的GPC1_ ...
- s3c6410开发板LED驱动程序设计详细…
2 下面来看看tiny6410关于LED的原理图如图(1)所示: 图1 LED原理图 3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c ...
- 兼容可控硅调光的一款LED驱动电路记录
1.该款电路为兼容可控硅调光的LED驱动电路,采用OB3332为开关控制IC,拓扑方案为Buck: 2.FB1:磁珠的单位是欧姆,而不是亨利,这一点要特别注意.因为磁珠的单位是按照它在某一频率 产生的 ...
- 20145316&20145229实验四:驱动程序设计
20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...
- linux驱动程序设计的硬件基础,王明学learn
linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...
- FL2440驱动添加(4)LED 驱动添加
硬件信息:FL2440板子,s3c2440CPU带四个LED,分别在链接GPB5,GPB6,GPB8,GPB10 内核版本:linux-3.8.0 led驱动代码如下: 值得注意地方地方: 1,定时器 ...
随机推荐
- NIO Socket非阻塞模式
NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...
- 精益创业之父Steve Blank: 怎样让企业内部创新获得50倍增速
编者注:本文英文版来自创新大师Steve Blank的个人博客,中文版由天地会珠海分舵进行编译.应用在初创企业打造上面的精益创业相信我们已经耳熟能详,可是假设我们面对的是一个已经发展起来的企业.或者是 ...
- 头像上传ASP.NET MVC实现-可拖动大小实时预览
这是一个ASP.NET MVC实现的类似于dz论坛的上传头像功能.可以拖动选择大小,支持多种尺寸生成. 效果界面 头像上传源码下载 项目中具体应用时,请根据需求做调整.欢迎交流~回复即可下载~源码下载 ...
- Eclipse中Java文件图标由实心J变成空心J的问题
在eclipse中空心J的java文件,表示不被包含在项目中进行编译,而是当做资源存在项目中.例如 当是单个文件为空心J的时候 1.右击该文件 -- >BuildPath -->Inclu ...
- 动态图片 gif
简介 android不推荐使用gif图片,一般都是png的,对于gif的图片解析比较消耗资源,但是对于一些动态gif图片的播放,如果比较小的话还是可以的,要是大的话,建议还是把gif图片转换成一帧一帧 ...
- C#之Linq学习笔记【转】
写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...
- php function_name($type=0,$order_ids='',$flag=2)
$order_ids='',表示$order_ids是字符串,不是数组 foreach ($order_ids as $key=>$order_id){ //TODO} 这 ...
- PHP set_error_handler() 函数
定义和用法 set_error_handler() 函数设置用户自定义的错误处理函数. 该函数用于创建运行时期间的用户自己的错误处理方法. 该函数会返回旧的错误处理程序,若失败,则返回 null. 语 ...
- windows下安装php笔记
为了更深入的理解下服务端的配置 ,上篇文章讲了如何在windows下安装apache , 接下来再研究下在windows下安装php并且结合apache运行php环境, 纯属学习用 ^^ ,如果嫌麻烦 ...
- JavaWeb学习笔记之JSP(一)
1. JSP: 1.1. 为什么需要 JSP ? 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,但是其中的静态网页内容也需要程序员使用Java语言来进行输出,这就造成了大量代码的冗余 ...