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,定时器 ...
随机推荐
- OC可变參数的函数实现va_start、va_end、va_list的使用
一.简单介绍 我们常常在编程的时候看见类似这种代码,如图1.1 图1.1 或者是这种可变參数,如图1.2 图1.2 二.基本知识介绍 在学习怎样写这样的格式的函数前,先简介几个经常使用的宏: 下面摘自 ...
- 在winform程序中实现按照不同的角色或用户展现不同的页面
SqlConnection cn = new SqlConnection(); cn.ConnectionString = "Data Source=192.168. ...
- JavaBean-Servlet-JavaServerPage(转)
1.servlet servlet是在服务器端执行的,具有良好的移植性,不论操作系统是Windows.Linux.Unix等等,都能将写好的Servlet程序放在这些操作系统上执行,是真正的写一次,到 ...
- javascript 中寻找性能瓶颈
1.如果一个段代码很耗时的话你可以注释掉一部分你认为是很耗时的,或者干脆全部注释掉,然后再一点一点的解开. 2.js优化中最主要的还是对dom操作的优化,单纯的js执行时间是很短的,而js和dom之间 ...
- mongodb一些特性
mongodb 地理位置 mongodb schema mongodb 定时任务 mysql 也有定时任务 mongodb 读写分离 http://blog.csdn.net/sd0902/artic ...
- 有关phpmailer的详细介绍及使用方法
第一,需要下载PHPMailer文件包phpmailer. http://phpmailer.sourceforge.net/第二,确认你的服务器系统已经支持socket ,通过phpinfo();查 ...
- 武汉科技大学ACM:1010: 电话号码
Problem Description LXD打算换个手机号码,但是他去营业厅选号码的时候却把移动的客服小姐烦得不行,因为他太挑三捡四啦.对于一个手机号的后六位数字(前面五位他就无所谓了),LXD有很 ...
- Eclipse关闭XML文件验证的方法,解决xml警告
XML的编写是否符合规范,可以通过XML Schema或DTD进行验证,但有时候电脑本来就很卡,而且XML的某些错误并未导致程序无法运行的情况下,暂时关闭XML的验证也算不错的选择. 如web.xml ...
- java学习笔记(11) —— Struts2与Spring的整合
1.右键 项目名称 —— MyEclipse —— Add Spring Capabilities 2.选取 Copy checked Library contents to project fold ...
- jQuery版本引发的血案 iframe error 和 checkbox 无法勾选
问题介绍: 1.由于我们的项目里面用了很多Iframe,在初始话加载的时候页面就会报错.一开始调试很久没找到什么原因,看打印结果页面会被两次load,只能一步步找, 最后发现在document rea ...