第七章

前面了解到了开发Linux驱动程序的步骤,也做了一个小的实例,现在要更进一步了,让LED等发亮。

首先来介绍一下LED发亮的实现原理:虽然linux驱动直接与硬件打交道,但并不是linux驱动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互。Linux内核的内存管理模块负责同步I/O内存与硬件中的数据。每一个连接linux的硬件在I/O内存中都会有映射首地址。

编写LED驱动是主要的,步骤为:

1.使用cdev_init函数初始化cdev , 描述设备文件

struct cdev{

  struct kobject kobj;    //封装设备文件的对象

  struct module *owner;   //指向内核模块的指针

  const struct file_operations *ops;  //指向file_operations结构体的指针

  struct list_head list;   //指向上一个和下一个cdev结构体的指针

  dev_t dev;  // 表示设备号,int类型,前12位主设备号,后20位次设备号

  unsigned int count;  //请求的连接设备编号范围(最大值),在建立多个设备文件时使用

}

void cdev_init(struct cdev *cdev,const struct file_operations *fops)

{

  memset(cdev,0,sizeof *cdev);

  INIT_LIST_HEAD(&cdev->list);

  kobject_init(&cdev->kobj,&ktype_cdev_default);

  cdev->ops = fops;

}

2.指定设备号    用1个int类型表示,前12位表示主设备号,后20位表示次设备号

int dev_number=MKDEV(major,minor); //major表示主设备号,minor表示次设备号

int major=MAJOR(dev_number);

int minor=MAJOR(dev_number);

3.使用cdev_add函数将字符设备添加到内核中的字符设备数组中

int cdev_add(struct cdev *p,dev_t dev,unsigned count)

{

  p->dec=dev;

  p->count-count;

  return kobj_map(cdev_map,dev,count,NULL,exact_match,exact_lock,p);

}

4.使用class_create 宏创建struct class

struct class *leds_class = NULL;

leds_class=class_create(THIS_MODULE,"dev_name");

5.使用device_create函数创建设备文件

device_create函数的原型如下:struct device *device_create(struct class *class,struct device *parent,dev_t devt,void *drvdata,const chahr*fmt,...)

leds_init函数是LED驱动的初始化函数:

static in leds_init(void)

{

  int ret;

  ret=leds_create_device();// 创建设备文件

  printk(DEVICE_NAME"\tinintialized\n");

}

module_init(leds_init);

在控制LED灯时有两种法方,通过字符串控制(使用file_operations.write函数)和AND 通过I/O命令控制LED(使用file_operations.ioctl函数)。

LED驱动的移植,首先要获取新的Linux内核的源代码,然后在新内核下重新编译即可。

 

转载于:https://www.cnblogs.com/xianrenzhilu/p/5561616.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的pm2 使用

pm2 start app.js pm2 start npm --name demo -- startpm2 delete all pm2 delete 0 pm2 delete demopm2 updata pm2 start npm --name demo -- start 需要用npm启动的项目 --name demo --需要设置的项目名

uni-app分享小程序页面给微信好友;小程序分享无效原因;小程序分享失败原因;

我的只是在html代码部分 使用 <button open-type"share" >发送</button>点击按钮就可以将当前页面分享到微信好友 且打开也是正常的小程序页面 可以操作 如果想要在小程序A页面&#xff0c;将小程序B页面分享给好友&#xff0c;多加一个方法onShareApp…

Handler的一个图片轮播程序

1 Handler是什么&#xff1f; * Handler&#xff1a;用来更新UI&#xff08;主线程&#xff09;的一套机制&#xff0c;也是一套消息处理机制&#xff0c;我们可以发送信息&#xff0c;也可以通过它来处理消息。 * 比如最常见的Activity的生命周期&#xff1a;它的回调方法都…

vue或js解析文件excel表格js通过插件解析表格读取文件

安装插件 cnpm i xlsx --save-dev cnpm i jquery --save-dev 引入插件 html引入文件 <input type"file" id"excel-file" value"file"/> dom加载完成解析文件 mounted() {$(#excel-file).change(function(e) {var files e.target.fi…

微信小程序request请求封装;微信小程序封装request请求;uni-app小程序封装request请求;

本片封装了微信小程序request请求&#xff1b;为别是post get put请求&#xff0c;重点在request.js文件 1.新增四个文件 2.根目录下的utils下的request.js封装uni.request()请求 2.1 manifest.json&#xff1a;解决H5浏览器跨域问题-----配置代理一定要重启项目 // 自定义配…

给std::string增加format函数

From: http://www.0xcode.cn/jishu/biancheng/5.html #ifndef lstring#ifdef _UNICODE#define lstring std::wstring#define lchar wchar_t#else#define lstring std::string#define lchar char#endif // _UNICODE#endif // lstring //// 函数名称: string_format// 函数说明…

《C语言深度剖析》学习笔记三

第三章 预处理 注释先于预处理指令被处理&#xff0c;所以无法用宏定义注释宏定义表达式时&#xff0c;每个参数都加括号&#xff0c;避免不必要的错误宏定义时&#xff1a; SUM (x) 和SUM(x)不同使用时&#xff1a; SUM(x) 和SUM (x)一样#define X 3#define Y X*2#undef X#def…

关“视觉神经系统是怎么形成的?”的思考

http://www.cnblogs.com/mrxsc/p/5571358.html 视觉信息的处理是一个非常复杂的过程&#xff0c;这不由得让我想到了同样位于人们大脑中的新大脑皮层&#xff0c;作为人类智能的起始之地&#xff0c;它的运作也不简单&#xff0c;但是在婴儿时期&#xff0c;它的各部分单元并没…

linux 打包解压

第一条打包 第二天解压 zip -r -q -o demo.zip ./demo/unzip -d demo ./demo

uni-app控制小程序版本更新;小程序自动更新版本;uni-app发布新版本后仍旧是老版本问题

问题&#xff1a; 首先小程序&#xff0c;更新版本发布后&#xff0c;用户的版本一般情况下仍是旧版本&#xff1b;需要手动删除小程序后&#xff0c;在重新搜索打开才能使用新版本&#xff1b; 原因查看&#xff1a; 运营机制&#xff1b;更新机制&#xff1b; 解决办法&…

浅尝boost之format

From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东&#xff0c;但实际使用时基本在每个程序里都会遇到不愉快的事情&#xff1a;格式化字符串。我甚至由于这个原因在代码里引入平台有关的MFC&#xff0c;ATL等本…

nuxt 服务器构建因太耗CPU进程被杀解决办法

在本地打包然后上传到github 再下载到服务器 如果你项目中有.gitignore那把里面的.nuxt删了(.gitignore是设置GIT不上传的文件)并把dist改为/dist 然后用git或者sourcetree上传项目到github&#xff0c;我这里用的sourceTree 上传完成 到服务器把项目下载下来 我这用的linu…

实用的rpm网站

http://www.rpmfind.net和 http://rpm.pbone.net/转载于:https://blog.51cto.com/nickcoco/993222

在VisualStadio2015上使用EF6.0建立MySql数据库

1.新建工程 2.建立类的文件夹DAL 3.建立相关类 【Student类】 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ETTest3{ public class Student { public int Id { get; set; } public string La…

固定列表的表格

固定的行&#xff1a;行名称不一样&#xff0c;每一个值对应赋值 html&#xff1a; <el-table class"table-box" :data"allObj.peoArr"><el-table-column prop"name" min-width"130"></el-table-column><el-ta…

拼图算法分析...

From: http://blog.sina.com.cn/s/blog_6a4b57e30100mfch.html 一、题目说明&#xff1a;   &#xff08;九宫问题&#xff09;在一个&#xff13;&#xff13;的九宫中有&#xff11;&#xff0d;&#xff18;这&#xff18;个数及一个空格随机的摆放在其中的格子里&#…

uni-app小程序本地打包超过2M不能预览问题;小程序打包过大不能预览和真机调试;uni-app分包;

一、问题&#xff1a;我们在小程序工具中开发时候&#xff0c;需要本地打包&#xff0c;但是当本地的打包文件大于2M时候&#xff0c;预览的二维码就会有问题&#xff0c;导致真机扫码打不开或者有遗漏。 二、此时就需要开启分包 1.微信小程序每个分包的大小是2M&#xff0c;总…

MySQL从5.5升级到5.6,TIMESTAMP的变化

转载来自http://blog.csdn.net/ghsau。 MySQL从5.5升级到5.6&#xff0c;TIMESTAMP的变化 TIMESTAMP在MySQL5.5中的行为 第一个未设置默认值的TIMESTAMP NOT NULL字段隐式默认值&#xff1a; CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP后面未设置默认值的TIMESTAMP NOT …

Asp.Net MVC开源CMS - Orchard

最近在学习Asp.Net MVC, 一直是step by step地看官方文档。 想找个成熟的MVC开发的开源系统&#xff0c;系统学习一下MVC, 搜索了一下&#xff0c;惊喜的发现了Orchard. 这个是介绍 2011/01/21号发布的关于Orchard的介绍&#xff0c;说明Orchard还是一个非常新鲜的事物。以后会…

letsencrypt 免费https安装过程linux centos

curl https://get.acme.sh | sh ~/.acme.sh/ 再修改conf的配置 /home/nginx-1.12.1/conf 目录里的nginx.conf server {server_name www.demo.com;location / {rewrite root html/index/;}} 重启 nginx /home/nginx-1.12.1/sbin/nginx -s reload 运行 我用的是nginx…