[国嵌攻略][117][LED驱动程序设计]
LED程序设计
1.编写内核模块
2.搭建字符驱动框架
3.实现设备方法
头文件
<linux/io.h>
writel()
1.编译/安装驱动
make
cp leddev.ko .../rootfs
insmod leddev.ko
2.创建设备文件
mknod /dev/myled0 c 253 0
3.编译/运行应用程序
arm-linux-gcc -static ledapp.c -o ledapp
cp ledapp .../rootfs
./ledadd 0
./ledadd 1
leddev.h
/********************************************************************
*设备命令
*********************************************************************/
#define LED_MAGIC 'L' //LED幻数
#define LED_ON _IO(LED_MAGIC, 0) //LED打开
#define LED_OFF _IO(LED_MAGIC, 1) //LED关闭
leddev.c
/********************************************************************
*头文件
*********************************************************************/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "leddev.h" /********************************************************************
*宏定义
*********************************************************************/
#define GPBCON 0x56000010 //控制寄存器物理地址
#define GPBDAT 0x56000014 //数据寄存器物理地址 /********************************************************************
*全局变量
*********************************************************************/
struct cdev chrdev; //字符设备
dev_t devnum; //主设备号 unsigned int *ledCon; //控制寄存器指针
unsigned int *ledDat; //数据寄存器指针 /********************************************************************
*设备方法
*********************************************************************/
//控制设备
long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){
//处理命令
switch(cmd){
case LED_ON: //打开LED
writel(0x00000000, ledDat); //GPBDAT[8:5]:0000
break; case LED_OFF: //关闭LED
writel(0x000001E0, ledDat); //GPBDAT[8:5]:1111
break; default:
return -EINVAL;
} return ;
} //打开设备
int led_open(struct inode *node, struct file *filp){
//配置LED引脚
ledCon = ioremap(GPBCON, ); //虚拟地址转换
writel(0x00015400, ledCon); //GPBCON[17:10]:01010101 //设置LED状态
ledDat = ioremap(GPBDAT, ); //虚拟地址转换
writel(0x00000140, ledDat); //GPBDAT[8:5]:1010 return ;
} //关闭设备
int led_close(struct inode *node, struct file *filp){
return ;
} //设备方法
struct file_operations led_fops = {
.unlocked_ioctl = led_ioctl,
.open = led_open,
.release = led_close
}; /********************************************************************
*模块安装
*********************************************************************/
//安装模块
static int led_init(){
//注册设备标识
cdev_init(&chrdev, &led_fops); //注册主设备号
alloc_chrdev_region(&devnum, , , "myled"); //添加设备标识
cdev_add(&chrdev, devnum, ); return ;
} //卸载模块
static void led_exit(){
//注销设备标识
cdev_del(&chrdev); //注销主设备号
unregister_chrdev_region(devnum, );
} /********************************************************************
*模块声明
*********************************************************************/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("D");
MODULE_DESCRIPTION("");
MODULE_VERSION("v1.0"); module_init(led_init);
module_exit(led_exit);
ledapp.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "leddev.h" int main(int argc, char **argv){
//参数检测
if(argc != ){
printf("Usage:\n\t%s <state>\n", argv[]);
return -;
} //打开设备
int fd; fd = open("/dev/myled0", O_RDWR); //控制设备
int state; state = atoi(argv[]);
if(state){ //打开LED
ioctl(fd, LED_ON);
}else{ //关闭LED
ioctl(fd, LED_OFF);
} //关闭设备
close(fd); return ;
}
[国嵌攻略][117][LED驱动程序设计]的更多相关文章
- [国嵌攻略][164][USB驱动程序设计]
USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...
- [国嵌攻略][160][SPI驱动程序设计]
SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...
- [国嵌攻略][151][nandflash驱动程序设计]
初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函 ...
- [国嵌攻略][065][DM9000驱动程序设计]
移植代码:通过已有的可用的代码修改到新环境下运行. 代码编写: 初始化网卡 1.选中网卡 nLAN_CS BWSCON(0x48000000) DW4:01 16bit BANKCON4(0x4800 ...
- [国嵌攻略][119][Linux中断处理程序设计]
裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...
- [国嵌攻略][061][2440LCD驱动设计]
LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...
- [国嵌攻略][052][NandFlash驱动设计_读]
NandFlash读数据方式 1.页读,读出页中主数据区的所有数据,提供页地址(行地址) 2.随机读,读出页中指定的存储单元的数据,提供页地址(行地址)和页内偏移(行地址) 代码编写 1.根据Nand ...
- [国嵌攻略][092][UDP网络程序设计]
server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...
- [国嵌攻略][091][TCP网络程序设计]
server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...
随机推荐
- 工厂方法模式(Method Factory),理解多态应用的好例子.
工厂方法模式又称为多态性工厂,个人认为多态性工厂更能准确的表达这个模式的用处.与简单工厂(静态工厂)相比较,这里的多态性是指抽象出一个工厂基类,将因为一个产品有N种不同的是现这种变化封装起来,将具体的 ...
- laravel框架一种方便的快速填充数据的方法
首先大家都知道在laravel框架里是采用seeder来填充数据的,具体命令如下,请将如下的类名称替换成你具体的seeder类名. 首先创建seeder类 php artisan make:seede ...
- 在ubuntu上安装pyenv出现的问题
1.安装完pyenv时,并没有出现问题.但在安装python3.6.1时报错: ERROR: The Python ssl extension was not compiled. Missing th ...
- ASP.NET Core读取AppSettings
http://www.tuicool.com/articles/rQruMzV 今天在把之前一个ASP.NET MVC5的Demo项目重写成ASP.NET Core,发现原先我们一直用的Configu ...
- java多线程(八)-死锁问题和java多线程总结
为了防止对共享受限资源的争夺,我们可以通过synchronized等方式来加锁,这个时候该线程就处于阻塞状态,设想这样一种情况,线程A等着线程B完成后才能执行,而线程B又等着线程C,而线程C又等着线程 ...
- ABP架构学习系列一 整体项目结构及目录
本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zha ...
- Travis CI实现持续部署
安装Ruby 2.0以上版本并安装travis的命令行工具 可以看出我的已经是安装好的(Ubuntu 16.04.3 LTS 系统) ruby -v ruby --) [x86_64-linux-gn ...
- 6月22日项目CodeReview问题及总结
后台代码部分 1. 枚举类的使用:当定义的某个字段有多种状态值或表示值时,可以创建一个枚举类将所有状态表示出来,并供其他使用到该字段的方法统一调用.枚举类定义可参考 '/banking-dbbp-pr ...
- 移动端页面 css reset
这个是通用的 css reset.这个版本适用于 移动端页面 如果需要在 PC端使用,可以 修改 html{font-size: 10px;}为html{font-size: 12px;} 其他地方 ...
- python3之日期和时间
1.python3日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时 ...