
Linux驱动开发
文章平均质量分 93
Linux硬件、基本使用、驱动开发基础
北城梦南
这个作者很懒,什么都没留下…
展开
-
OpenNetworkLinux:i2c-gpio.c源码学习笔记
OpenNetworkLinux:i2c-gpio.c源码学习笔记i2c-gpio驱动init和exiti2c驱动需要首先在平台驱动上进行注册,方可提供自身的总线供适配器进行注册,注册流程类似于一个内核模块的注册流程;而平台驱动 - 总线驱动 - 适配器 - 设备的关系类似于树状结构,关系上层层递进;·i2c_gpio_init函数代码:static int __init i2c_gpio_init(void){ int ret; ret = platform_driver_regis原创 2021-01-25 20:12:59 · 475 阅读 · 0 评论 -
Linux驱动开发-第九章-I2C核心、总线、设备驱动、数据传输
I2C核心、总线、设备驱动、数据传输I2C 总线特征• 只要求两条总线线路: 一条串行数据线 SDA/一条串行时钟线 SCL。 SDA 和 SCL 都是双向线路, 当总线空闲时这两条线路都是高电平都通过一个电流源或上拉电阻连接到正的电源电压• 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机、从机关系软件设定地址 主机可以作为主机发送器或主机接收器•它是一个真正的多主机总线,如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁,防止数据被破坏• 串行的 8 位双向数据传输位速率原创 2021-01-23 16:12:44 · 422 阅读 · 0 评论 -
Linux驱动开发-第六章-Linux阻塞与非阻塞IO、轮询与异步通知编程
Linux阻塞与非阻塞IO、轮询与异步通知编程阻塞与非阻塞IO阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞操作的进程在不能进行设备操作时,并不挂起,它要么放弃,要么不停地查询,直至可以进行操作为止。等待队列的Linux驱动代码示例:static ssize_t xxx_write(struct file *file, const char *buffer, size原创 2021-01-22 14:23:16 · 167 阅读 · 0 评论 -
Linux驱动开发-第五章-Linux设备驱动中的并发控制
Linux设备驱动中的并发控制并发与竞态并发(Concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(Race Conditions)1、对称多处理器(SMP)的多个CPUSMP是一种紧耦合、共享存储的系统模型,其体系结构如图所示,它的特点是多个CPU使用共同的系统总线,因此可访问共同的外设和储存器。在SMP的情况下,两个核(CPU0和CPU1)的竞态可能发生于CPU0的进程与CPU1的进程原创 2021-01-21 09:20:35 · 244 阅读 · 0 评论 -
Linux驱动开发-第四章-Linux字符设备驱动
Linux字符设备驱动字符设备是指在I/O传输过程中以字符为单位进行传输的设备,例如键盘,打印机等。在UNIX系统中,字符设备以特别文件方式在文件目录树中占据位置并拥有相应的结点。字符设备可以使用与普通文件相同的文件操作命令对字符设备文件进行操作,例如打开、关闭、读、写等。当一台字符型设备在硬件上与主机相连之后,必须为这台设备创建字符特别文件。操作系统的mknod命令被用来建立设备特别文件。例如为一台终端创建名为/dev/tty03的命令如下(设主设备号为2,次设备为13,字符型类型标记c原创 2021-01-21 09:16:57 · 167 阅读 · 0 评论 -
Linux驱动开发-第三章-Linux内核模块概述
Linux内核模块Linux内核模块简介模块本身不被编译入内核镜像,从而控制了内核的大小;模块一旦被加载,就和内核中的其他模块一样;简单的内核模块代码示例:/* * a simple kernel module: hello * * Copyright (C) 2014 Barry Song (baohua@kernel.org) * * Licensed under GPLv2 or later. */#include <linux/init.h>#includ原创 2021-01-19 10:52:45 · 104 阅读 · 0 评论 -
Linux驱动开发-第二章-Linux内核和内核编程
Linux内核和内核编程内核的组成Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)5个子系统组成:1、进程调度进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中“微观串行,宏观并行”地执行。进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。如下图所示,Linux的进程在几个状态间进行切换。在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他原创 2021-01-19 10:04:00 · 346 阅读 · 0 评论 -
Linux驱动开发-第一章-硬件基础
硬件基础处理器1、通用处理器(GPP)目前主流的通用处理器(GPP)多采用SoC(片上系统)的芯片设计方法,集成了各种功能模块,每一种功能都是由硬件描述语言设计程序,然后在SoC内由电路实现的。中央处理器的体系架构:冯·诺依曼结构,也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。哈佛结构,将程序指令和数据分开存储,指令和数据可以有不同的数据宽度。此外,哈佛结构还采用了独原创 2021-01-18 10:47:12 · 683 阅读 · 0 评论 -
UNIX环境编程_进程控制
进程标识:每个进程都有一个非负整型表示的唯一进程ID,而进程ID是可以复用的,Unix系统通过延迟复用算法,使得赋予新建进程的进程ID不同于最近终止进程所使用的进程ID。进程ID = 0 :swapper(交换进程);进程ID = 1 :init(系统中孤儿进程的父进程)进程ID = 2 :page daemon(页守护进程,支持虚拟存储器的系统的分页操作);相关函数函数get*:1、getpid: 返回调用进程的进程ID;2、getppid:返回调用进程的父进程ID;3原创 2020-06-22 17:50:21 · 146 阅读 · 0 评论 -
UNIX环境编程_文件IO
文件描述符:使用文件描述符访问文件,文件描述符是一个非负整数,当打开或创建一个文件时,内核向进程传递一个文件描述符,依照惯例,文件描述符取值通常为0、1、2(stdin,stdout,stderr)。相关函数函数open、openat:1、open:*path(文件路径)、oflag(打开方式[只读、只写、读写打开]);2、openat:*path(文件路径)、oflag(打开方式[只读、只写、读写打开])、fdfd参数作用于path为相对路径名时,指出了相对路径名在文件系统中的原创 2020-06-20 16:44:20 · 137 阅读 · 0 评论