当前位置: 首页 > news >正文

Linux驱动学习之点灯(一)

学习不同的板子我们都是从点灯开始,linux驱动也不例外

驱动开发基础知识

何为驱动?

驱使硬件正常工作的代码就叫做驱动。

在一些mcu里:

        无非就是直接操作寄存器,或者用库函数初始化外设,使外设正常工作如初始化iic,spi等,这样的代码就叫驱动。

在linux里:

        不像在mcu里,拿一个led灯举例子,

         mcu:

                操作寄存器初始化gpio(库函数),在main里开灯关灯。

         linux下:

                     也可以像mcu一样在内核层直接开灯,内核不断加载卸载很浪费资源,效率极 低,linux下的内核模块代码,是独立运行的单元,很难像mcu一样一个代码一个工程代表整个单片机运行程序。

                      就算在内核层把代码写死,系统开发工程师不懂驱动怎么操作led灯。

我写了一个驱动

你作为你个智能家居软件开发工程师想用我写的驱动控制led灯

真正的linux驱动:

        不像mcu一样,把代码写死,

        首先linux下的驱动符合linux驱动的原则:驱使硬件正常工作的代码,在内核层把led设备抽象一个一个文件,写驱动就是完成这件事,把设备变成文件。软甲就可以直接操作文件,执行一系列操作。

以led灯位列:

        led灯->led驱动->文件  /dev/led

        应用层开发者->打开/dev/led->灯亮

        应用层开发者->关闭/dev/led->灯灭

linux分层思想

直接操作寄存器,高效,便捷,但不利于移植,不通用,换个芯片就得重构代码。

而linux系统其他所有系统都在做软硬件分离

分离就靠中间层

linux不管换什么平台,因为中间层都一样,驱动框架代码都一样

从这方面来讲驱动比mcu简单多了

linux分层处处可见,不仅把驱动做了分层,底层的外设驱动也做了分层,如spi,分为厂家驱动和可供用户操作的API接口。

                        

厂商的驱动也做了分层,分为硬件信息和底层驱动 

linux下学的所有API都是通用的。

驱动开发的框架

1.写驱动框架

2.驱动框架,把设备抽象为文件

                设备的设备号->设备ID->让内核管理
                (设备内核操作接口->文件操作接口(内核你驱动开发者要单独实现一套)
                你写的内核层的打开关闭读写跟上层(系统层--对应)
                这是也是你留给上层的操作接口!

3.编译成.ko->insmod Xxx.ko->生成设备文件(/dev/xxxx)
4:调用加载/入口函数->内核框架->生成设备文件
5:上层/你自己调用文件操作->操作设备

 设备驱动文件的特点

系统的特殊文件

管道,套接字,块设备,字符设备

用非缓存io操作。

linu驱动设备文件分为三类

字符设备(char)

一般指的是除了存储网络设备之外的所有的其他设备鼠标按键触摸屛LED灯蜂鸣器键盘摄像头液晶屏

网络设备

wifi 4g

块设备(储存)

正常储存设备,厂商一般完成了初始化

小型储存设备 ,spi_flash eeprom

设备号

设备号是一个无符号的32位的整形,理论上设备最多挂在2^32个设备 

设备号分为主设备号和次设备号

主设备号

占32位设备号的高12位,但是他最大255

次设备号

占32位设备号的低20位,最大255

按设备号算最多挂载255^2个设备

字符设备传输

按字节传输

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SVN限制提交文件必须填写日志---实操笔记
  • 【杂乱笔记】Kmp字符串匹配算法
  • 鸿萌数据恢复服务:SQL Server 中的“PFS 可用空间信息不正确”错误
  • XSS游戏
  • HTTP范围放大攻击简记
  • 三丰云免费服务器
  • 如何使用midjourney?MidJourney订阅计划及国内订阅教程
  • Java Instance(实例)的创建过程
  • SpringCloud天机学堂:分布式任务调度
  • 前端不同项目使用不同的node版本(Volta管理切换)
  • 超详细排序汇总--插入排序类,选择排序类,交换排序类,归并排序,非比较排序
  • (七)Flink Watermark
  • leetcode108.把升序数组转换成二叉搜索树
  • 【前端】VUE动态引入组件 通过字符串动态渲染模板 动态生成组件
  • 【ubuntu24.04】k8s 部署5:配置calico 镜像拉取
  • 【刷算法】从上往下打印二叉树
  • 2017届校招提前批面试回顾
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • css布局,左右固定中间自适应实现
  • Git同步原始仓库到Fork仓库中
  • HashMap剖析之内部结构
  • JAVA SE 6 GC调优笔记
  • JavaScript 奇技淫巧
  • JavaScript实现分页效果
  • 百度小程序遇到的问题
  • 后端_ThinkPHP5
  • 记录一下第一次使用npm
  • 京东美团研发面经
  • 开源地图数据可视化库——mapnik
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端面试总结(at, md)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 微信小程序填坑清单
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一些css基础学习笔记
  • 中文输入法与React文本输入框的问题与解决方案
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​人工智能书单(数学基础篇)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # centos7下FFmpeg环境部署记录
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (33)STM32——485实验笔记
  • (Java数据结构)ArrayList
  • (k8s)Kubernetes本地存储接入
  • (k8s中)docker netty OOM问题记录
  • (八)Spring源码解析:Spring MVC
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (一)为什么要选择C++
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转载)虚函数剖析
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 3.0 Framework已经被添加到WindowUpdate