第四季-专题11-LED驱动程序设计
专题11-LED驱动程序设计
第1课-字符设备控制
- 设备控制理论
(1)作用
大部分驱动程序除了需要提供读写设备的能力外,还需要具备控制设备的能力。比如: 改变波特率。
(2)应用程序接口
在用户空间,使用ioctl系统调用来控制设备,原型如下:
int ioctl(int fd,unsigned long cmd,...)
fd: 要控制的设备文件描述符
cmd: 发送给设备的控制命令
…: 第3个参数是可选的参数,存在与否是依赖于控制命令(第2 个参数)。
(3)设备驱动方法
当应用程序使用ioctl系统调用时,驱动程序将由如下函数来响应:
1: 2.6.36 之前的内核
long (*ioctl) (struct inode* node ,struct file* filp, unsigned int cmd,unsigned long arg)
2:2.6.36之后的内核
long (*unlocked_ioctl) (struct file *filp, unsigned int cmd, unsigned long arg)
参数cmd: 通过应用函数ioctl传递下来的命令
- 设备控制实现
(1) 定义命令
命令从其实质而言就是一个整数, 但为了让这个整数具备更好的可读性,我们通常会把这个整数分为几个段:类型(8位),序号,参数传送方向,参数长度。
Type(类型/幻数): 表明这是属于哪个设备的命令。
Number(序号),用来区分同一设备的不同命令
Direction:参数传送的方向,可能的值是_IOC_NONE(没有数据传输), _IOC_READ, _IOC_WRITE(向设备写入参数)
Size: 参数长度
Linux系统提供了下面的宏来帮助定义命令:
_IO(type,nr):不带参数的命令
_IOR(type,nr,datatype):从设备中读参数的命令
_IOW(type,nr,datatype):向设备写入参数的命令
例:
#define MEM_MAGIC ‘m’ //定义幻数
#define MEM_SET _IOW(MEM_MAGIC, 0, int)
(2) 实现操作
unlocked_ioctl函数的实现通常是根据命令执行的一个switch语句。但是,当命令号不能匹配任何一个设备所支持的命令时,返回-EINVAL.
编程模型:
Switch cmd
Case 命令A:
//执行A对应的操作
Case 命令B:
//执行B对应的操作
Default:
// return -EINVAL
- 自己动手写驱动
Led.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <mach/gpio-bank-k.h>
#include "led.h"
#define LEDCON 0x7f008800
#define LEDDAT 0x7f008808
unsigned int *led_config;
unsigned int *led_data;
struct cdev cdev;
dev_t devno;
int led_open(struct inode *node, struct file *filp)
{
led_config = ioremap(LEDCON,4);
writel(0x11110000,led_config);
led_data = ioremap(LEDDAT,4);
return 0;
}
long led_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
switch (cmd)
{
case LED_ON:
writel(0x00,led_data);
return 0;
case LED_OFF:
writel(0xff,led_data);
return 0;
default:
return -EINVAL;
}
}
static struct file_operations led_fops =
{
.open = led_open,
.unlocked_ioctl = led_ioctl,
};
static int led_init()
{
cdev_init(&cdev,&led_fops);
alloc_chrdev_region(&devno, 0 , 1 , "myled");
cdev_add(&cdev, devno, 1);
return 0;
}
static void led_exit()
{
cdev_del(&cdev);
unregister_chrdev_region(devno,1);
}
module_init(led_init);
module_exit(led_exit);
led_app.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "led.h"
int main(int argc, char *argv[])
{
int fd;
int cmd;
if (argc <2 )
{
printf("please enter the second para!\n");
return 0;
}
cmd = atoi(argv[1]);
fd = open("/dev/myled",O_RDWR);
if (cmd == 1)
ioctl(fd,LED_ON);
else
ioctl(fd,LED_OFF);
return 0;
}
转载于:https://www.cnblogs.com/free-1122/p/11452260.html
第四季-专题11-LED驱动程序设计相关推荐
- Linux字符设备驱动程序开发(4)-LED驱动程序设计
这里编写一个LED内核驱动代码.流程大概如下: 1.实现一个内核模块. 2.添加字符设备驱动框架. 3.在字符设备驱动中实现open和ioctl函数. 4.编写应用程序. led.c #include ...
- 第十七届智能车竞赛英飞凌专题培训 ——无线充电组浅析及LED驱动方案讲解
第十七届全国大学生智能汽车竞赛重新定义了无线充电组,不再强调节能,而是通过限定超级电容的容量来降低单次电量的续航里程,需要在行进中自行规划是否需要补充电能以及补充多少,对充电策略.速度控制策略提出 ...
- linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第四十一章嵌入式Linux LED驱动开发实验 上一章我 ...
- 【正点原子Linux连载】第四十一章 嵌入式Linux LED驱动开发实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 【正点原子MP157连载】第二十一章 嵌入式Linux LED驱动开发实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 【嵌入式开发】LED 驱动 ( LED发光二极管原理 | 底板原理图分析 | 核心板原理图分析 | GPIO | 裸板程序烧写流程 )
文章目录 开发板 的 LED 灯 作用 : 嵌入式软件的开发初期, 如 开发 BootLoader 代码 或者 Kernel 内核代码 过程中, 有效的调试方法有限, 此时通常使用 开发板上的 LED ...
- Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)
Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...
- 信息安全系统设计基础 实验四:外社驱动程序设计 20135327郭皓 20135329 李海空...
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全设计基础 班级:1353 姓名:郭皓 李海空 学号:20135327 ...
- 信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮
北京电子科技学院(BESTI) 实 验 报 告 封 面 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号: 20145222 20145213 成绩: 指导教师:娄嘉鹏 实验日期 ...
- Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)
目录 Linux 下LED 灯驱动原理 地址映射(ioremap映射.iounmap释放) I/O 内存访问函数 硬件原理图分析 实验程序编写 LED 灯驱动程序编写 APP测试程序编写 运行测试 编 ...
最新文章
- 矩阵中的最长递增路径
- mybatis使用过程遇到的一些问题及解决方法
- 亚马逊云服务开通指南_亚马逊弹性容器服务初学者指南
- 解题:POI 2008 Station
- 可视化程序设计基础(team)——采访上届大佬
- HTML问答页面模板,问答社区简单静态页面模板
- 读计算机网络得学五笔吗,有人说五笔输入法已经被淘汰,现在还有必要学五笔吗?...
- 用Excel控件做动态图表
- 冒泡排序java实现
- 打开360浏览器显示无法连接服务器错误,最近360浏览器老是无法打开网页,提示错误如图,但是只要刷新就可以打开了,这是怎么回事?...
- balenaEtcher for mac(U盘启动盘制作工具)
- 数据分析课堂笔记Day10(20221123)
- 支付宝APP支付——支付流程说明及示例
- 【超详细】MySQL零基础入门实战
- mysql存储引擎查看语句,在MySQL中,可以使用(??)语句查看MySQL服务器采用的默认存储引擎...
- python数据分析师下载_2020云开见明Python数据分析师特训营,全套课程资源下载...
- 王爽汇编语言 实验3
- 支付行业对APILink的应用
- 如何拆分PDF文件?简单几步轻松拆分
- sorce insight 4.0 编辑程序不更新下载如何设置
热门文章
- java从入门到入土_java从入门到入土---基础篇04---IO
- 四川大学计算机应用基础第二次作业,四川大学川成教2017年秋季《计算机应用基础》第二次作业...
- Android水平仪实训报告,测量实训报告范文3篇
- 循环队列的创建Java_Java版-数据结构-队列(循环队列)
- 双亲委派模型与 Flink 的类加载策略
- IDEA 卡成球了 !咋优化 ?
- tomcat与mysql分离部署_apache+tomcat+mysql 实现动静分离
- 公众号 多服务器配置_多领国微信官方公众号在线
- go语言环境搭建以及监测命令
- delphi 2010 mysql_DELPHI 10.2 TOKYO搭建LINUX MYSQL开发环境