专题11-LED驱动程序设计

第1课-字符设备控制

  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. 设备控制实现

(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

  1. 自己动手写驱动

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驱动程序设计相关推荐

  1. Linux字符设备驱动程序开发(4)-LED驱动程序设计

    这里编写一个LED内核驱动代码.流程大概如下: 1.实现一个内核模块. 2.添加字符设备驱动框架. 3.在字符设备驱动中实现open和ioctl函数. 4.编写应用程序. led.c #include ...

  2. 第十七届智能车竞赛英飞凌专题培训 ——无线充电组浅析及LED驱动方案讲解

      第十七届全国大学生智能汽车竞赛重新定义了无线充电组,不再强调节能,而是通过限定超级电容的容量来降低单次电量的续航里程,需要在行进中自行规划是否需要补充电能以及补充多少,对充电策略.速度控制策略提出 ...

  3. linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第四十一章嵌入式Linux LED驱动开发实验 上一章我 ...

  4. 【正点原子Linux连载】第四十一章 嵌入式Linux LED驱动开发实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. 【正点原子MP157连载】第二十一章 嵌入式Linux LED驱动开发实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  6. 【嵌入式开发】LED 驱动 ( LED发光二极管原理 | 底板原理图分析 | 核心板原理图分析 | GPIO | 裸板程序烧写流程 )

    文章目录 开发板 的 LED 灯 作用 : 嵌入式软件的开发初期, 如 开发 BootLoader 代码 或者 Kernel 内核代码 过程中, 有效的调试方法有限, 此时通常使用 开发板上的 LED ...

  7. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

  8. 信息安全系统设计基础 实验四:外社驱动程序设计 20135327郭皓 20135329 李海空...

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全设计基础                         班级:1353 姓名:郭皓 李海空 学号:20135327 ...

  9. 信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮

    北京电子科技学院(BESTI) 实 验 报 告 封 面 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号: 20145222 20145213 成绩: 指导教师:娄嘉鹏 实验日期 ...

  10. Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)

    目录 Linux 下LED 灯驱动原理 地址映射(ioremap映射.iounmap释放) I/O 内存访问函数 硬件原理图分析 实验程序编写 LED 灯驱动程序编写 APP测试程序编写 运行测试 编 ...

最新文章

  1. 矩阵中的最长递增路径
  2. mybatis使用过程遇到的一些问题及解决方法
  3. 亚马逊云服务开通指南_亚马逊弹性容器服务初学者指南
  4. 解题:POI 2008 Station
  5. 可视化程序设计基础(team)——采访上届大佬
  6. HTML问答页面模板,问答社区简单静态页面模板
  7. 读计算机网络得学五笔吗,有人说五笔输入法已经被淘汰,现在还有必要学五笔吗?...
  8. 用Excel控件做动态图表
  9. 冒泡排序java实现
  10. 打开360浏览器显示无法连接服务器错误,最近360浏览器老是无法打开网页,提示错误如图,但是只要刷新就可以打开了,这是怎么回事?...
  11. balenaEtcher for mac(U盘启动盘制作工具)
  12. 数据分析课堂笔记Day10(20221123)
  13. 支付宝APP支付——支付流程说明及示例
  14. 【超详细】MySQL零基础入门实战
  15. mysql存储引擎查看语句,在MySQL中,可以使用(??)语句查看MySQL服务器采用的默认存储引擎...
  16. python数据分析师下载_2020云开见明Python数据分析师特训营,全套课程资源下载...
  17. 王爽汇编语言 实验3
  18. 支付行业对APILink的应用
  19. 如何拆分PDF文件?简单几步轻松拆分
  20. sorce insight 4.0 编辑程序不更新下载如何设置

热门文章

  1. java从入门到入土_java从入门到入土---基础篇04---IO
  2. 四川大学计算机应用基础第二次作业,四川大学川成教2017年秋季《计算机应用基础》第二次作业...
  3. Android水平仪实训报告,测量实训报告范文3篇
  4. 循环队列的创建Java_Java版-数据结构-队列(循环队列)
  5. 双亲委派模型与 Flink 的类加载策略
  6. IDEA 卡成球了 !咋优化 ?
  7. tomcat与mysql分离部署_apache+tomcat+mysql 实现动静分离
  8. 公众号 多服务器配置_多领国微信官方公众号在线
  9. go语言环境搭建以及监测命令
  10. delphi 2010 mysql_DELPHI 10.2 TOKYO搭建LINUX MYSQL开发环境