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驱动程序设计]的更多相关文章

  1. [国嵌攻略][164][USB驱动程序设计]

    USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...

  2. [国嵌攻略][160][SPI驱动程序设计]

    SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...

  3. [国嵌攻略][151][nandflash驱动程序设计]

    初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函 ...

  4. [国嵌攻略][065][DM9000驱动程序设计]

    移植代码:通过已有的可用的代码修改到新环境下运行. 代码编写: 初始化网卡 1.选中网卡 nLAN_CS BWSCON(0x48000000) DW4:01 16bit BANKCON4(0x4800 ...

  5. [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...

  6. [国嵌攻略][061][2440LCD驱动设计]

    LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...

  7. [国嵌攻略][052][NandFlash驱动设计_读]

    NandFlash读数据方式 1.页读,读出页中主数据区的所有数据,提供页地址(行地址) 2.随机读,读出页中指定的存储单元的数据,提供页地址(行地址)和页内偏移(行地址) 代码编写 1.根据Nand ...

  8. [国嵌攻略][092][UDP网络程序设计]

    server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...

  9. [国嵌攻略][091][TCP网络程序设计]

    server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...

随机推荐

  1. bzoj 2298: [HAOI2011]problem a

    Description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n ...

  2. vue-router项目实战总结

    今天来谈谈vue项目{vue,vue-router,component}三大神将之一的vue-router.作为我们前后端分离很重要的实践之一,router帮我们完成了SPA应用间的页面跳转. 并且, ...

  3. ln 命令详解

    ln 命令 作用:它的功能是为某一个文件在另外一个位置建立一个同步的链接 参数:必要参数:  -b 删除,覆盖以前建立的链接  -d 允许超级用户制作目录的硬链接  -f 强制执行  -i 交互模式, ...

  4. 深入理解用户权限rwx

    其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应的权限,如果是0则没有相应权限第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于 ...

  5. UTC 通用格式时间 转换为 时间戳,并格式化为2017-01-01 12:00:00

    在使用阿里云oss获取文件列表是,发现时间格式是这样的 2016-09-20T13:45:04.000Z (尼玛,是什么鬼), 经过度娘的解答,发现这就是传说中的 UTC通用格式时间 问题来了,怎么转 ...

  6. shell的含义

    shell:壳,是操作linux最直接的方式,通过shell中输入命令和linux系统进行交互. shell是一个小盒子,每一个有独立的命名空间,登录后的操作就是一个shell(有可能是bash,zs ...

  7. Tomcat 到底依赖JRE还是JDK

    Tomcat 6.0 以上可以不再依赖JDK运行,直接使用JRE即可,但Tomcat 5.5以下,是必须安装JDK的. 这主要是由于,Tomcat 5.5及以下版本主要是依赖JDK去编译JSP文件生成 ...

  8. longest valid parentheses方法归纳

    题目大意见leetcode,下面我稍微介绍下想到的三种方法: 方法一:不用栈去找匹配 建立一个数组l2表示匹配,然后i从0开始,看到 ( 就把l2对应的数值记为-1,直到看到 ),找到)以后,从当前i ...

  9. [js高手之路] vue系列教程 - 绑定class与行间样式style(6)

    一.绑定class属性的方式 1.通过数组的方式,为元素绑定多个class <style> .red { color:red; /*color:#ff8800;*/ } .bg { bac ...

  10. angular4.0运行在微信端的坑坑洼洼

    最近的一个项目,我用ng4操刀,踩了超多的坑: 坑1:项目build后,刷新后404错误: 解决方案:<angular4.0项目build发布后,刷新页面报错404> 坑2:微信分享: 运 ...