avatar
Articles
127
Tags
0
Categories
17
首页
归档
友链
李瑞琦的博客
首页
归档
友链

李瑞琦的博客

05 字符设备驱动框架
Updated2025-10-31|04-Linux03-内核开发
字符设备驱动框架简介Linux的字符设备驱动框架是以struct cdev为核心的一套API,通过向内核注册cdev,从而向用户空间提供对设备进行IO操作的接口 注意:Linux字符设备驱动框架主要用于封装设备的IO操作,有别于Linux的设备驱动模型,并不负责设备与驱动的匹配之类的,所以2者通常同时出现 而且不是所有字符设备的驱动都需要用到这个框架,比如一个用了input子系统的按键,它不需要向用户提供IO操作的接口,所以就不需要(其实这是驱动分层的结果,input子系统的核心层会用到该框架来提供用户对/dev/input/eventXIO操作的能力,但我们自己写的驱动层不需要用) 核心组件 cdev12345678910111213141516struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int...
06 platform设备驱动框架
Updated2025-10-31|04-Linux03-内核开发
platform设备驱动框架platform驱动框架由驱动分离的思想引出了总线、驱动和设备模型,Linux提出了platform驱动框架,为设备的注册、匹配、管理等操作提供了统一的接口。但是并不是所有设备都有物理总线,比如SoC内部的I2C、SPI、LCD等控制器与CPU内核的连接。为了解决此问题,platform驱动框架虚拟出一条platform总线,使得所有的设备都可以应用驱动分离模型 platform框架和字符设备框架是独立的,2者一般需要同时使用,前者是对整个驱动开发流程的一个统一化,主要包括硬件资源描述和驱动的匹配和资源管理;后者负责具体字符设备的设备节点、设备号的创建、以及与用户空间交互的IO操作之类的东西 platform总线Linux内核定义结构体struct bus_type来定义各种总线 123456789101112131415161718192021222324struct bus_type { const char *name; /* 总线名字 */ const char ...
07 pinctrl子系统
Updated2025-10-31|04-Linux03-内核开发
pinctrl子系统pinctrl子系统的作用 获取设备树中 pin 的信息 设置 pin 的复用功能 设置 pin 的电气特性,比如上/下拉、速度、驱动能力等 相关硬件对于引脚的配置,不同平台通常不一样: IMX6ULL这款SoC中有2个专门的引脚配置的硬件模块IOMUXC(Input/Output Muliplexing Controller),和IOMUXC-SNVS。通过设置该控制器的某些寄存器,就可以实现对指定引脚的配置。 IOMUXC和IOMUXC-SNVS的区别主要在于配置的引脚所属的电源域,前者控制主电源域的引脚,而后者控制SNVS这个独立的电源域的引脚(该电源域用于在系统休眠时维持部分功能) 同一个引脚只能由一个引脚配置模块来配置 而STM32就没有独立的IOMUXC,其引脚的电气属性及复用的配置全由GPIO控制器来做 使用方法pinctrl子系统的使用通常遵循以下步骤: 1.定义引脚控制组:节点的名字一般以grp结尾 1234567&iomuxc { // LED的引脚控制组 pinctrl_led:...
08 GPIO子系统
Updated2025-10-31|04-Linux03-内核开发
GPIO子系统GPIO子系统是 Linux 内核中用于管理和控制通用输入/输出引脚的核心框架,它为开发者提供了统一的接口来操作硬件上的 GPIO 引脚,使用前需要用pinctrl将该引脚的复用配置成GPIO 驱动架构GPIO子系统的驱动同样遵循着“主机驱动和设备驱动分离”和“驱动分层”的思想,分为主机驱动层、核心层、设备驱动层 主机驱动层主机(GPIO控制器)驱动一般由原厂提供,且也作为设备树中的一个节点 SoC内部对于GPIO一般都有专门的控制器外设,它直接位于SoC的内存空间,通过配置该外设的寄存器,从而控制某个具体的GPIO 12345678910111213141516/{ soc{ aips1{ gpio1: gpio@0209c000 { compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio"; reg = <0x0209c000 0x4000>; interrupts =...
09 MISC设备驱动框架
Updated2025-10-31|04-Linux03-内核开发
MISC设备驱动框架 MISC设备又称杂项设备,由于一些设备不好分类,所有可以把他们都归到杂项设备里面。字符设备也可以看成一种杂项设备,使用MISC驱动框架时,可以简化字符设备驱动的开发 Misc是Linux驱动开发里的一个子系统,它也遵循了驱动分层的思想,用一个核心层来完成对此类设备IO操作之类的通用操作的封装,用户只需要写简单的驱动实例层并注册设备到该子系统就行了 1.MISC设备简介Linux内核提供了struct miscdevice来定义杂项设备 可以看到,misc框架其实把字符设备驱动框架(fops)和Linux设备驱动模型(device)==封装到了一起==,可以同时向用户层提供I/O操作的接口,并完成驱动和设备的匹配 1234567891011struct miscdevice { int minor; const char *name; const struct file_operations *fops; struct list_head list; ...
10 Linux内核定时器
Updated2025-10-31|04-Linux03-内核开发
Linux内核定时器 在编写驱动的时候,可能也会用到定时器,比如按键消抖…由于驱动的代码是在内核态,所以就需要使用内核态的定时器,而不是用户态的定时器 Linux内核的定时器相对于以前STM32用的定时器,有以下区别: 内核定时器是软件定时器,采用系统时钟实现,并不是硬件定时器 定时器超时是由软件设置和管理的,通过内核或者应用程序来控制,而回调函数的执行是在预定的时间点或者时间间隔后发生的,不算中断 内核定时器不是周期运行的,超时后就会停止,需要手动再次开启(如果还需要用的话) 1.基本数据结构Linux内核使用如下的结构体来描述一个定时器: 12345678struct timer_list { struct list_head entry; unsigned long expires; /* 定时器超时时间,单位是节拍数 */ struct tvec_base *base; void (*function)(unsigned long); /* 定时处理函数 */ unsigned long data; /*...
11 Linux内核中断
Updated2025-10-31|04-Linux03-内核开发
Linux内核中断总览Linux驱动开发中,对于中断,同样遵循着“驱动分层”和“主机驱动和设备驱动分离”的思想,可以分为以下几层: 1.硬件/架构相关层(最底层) 这是与CPU内核、ISA相关的实现层,负责: 处理器特定的中断控制器操作(如x86的APIC、ARM的GIC) 中断向量表的设置 底层中断启用/禁用 中断上下文保存与恢复 文件位置:arch/xxx/kernel/irq.c(如arch/arm/kernel/irq.c) 2.中断控制器驱动层(irqchip driver) 这是针对具体SoC的中断控制器的驱动层,例如: ARM GIC驱动(drivers/irqchip/irq-gic.c) x86 IOAPIC驱动 其他SoC专用中断控制器 这些驱动需要: 初始化硬件中断控制器 实现irq_chip操作集(如mask/unmask中断) 处理硬件级中断路由 3.中断核心层(irq core) 这是Linux内核提供的通用中断子系统核心,负责: 中断描述符管理(struct...
12 内存与IO空间的访问
Updated2025-10-31|04-Linux03-内核开发
内存与IO空间的访问内存和IO的硬件机制内存空间和IO空间 IO空间:x86架构CPU中的一个概念,代表了外设寄存器地址空间,通过特定指令访问 内存空间:大多数嵌入式CPU并没有IO空间,仅存在内存空间。可以直接通过地址、指针访问 不同CPU的地址空间一般都是从0x000000开始的,但是哪个外设对应哪一部分,一般都是不确定的,比如Imx6ull中,DDR的地址空间是从0x80000000开始的 内存管理单元内存管理单元(MMU)是CPU的非常重要的一个组件,用于辅助OS进行内存管理,它的功能如下: 提供虚拟地址到物理地址的映射 内存访问权限保护 缓存控制:通过PTE的某些字段来控制缓存的行为,比如是否允许缓存、缓存写回策略… 转换旁路缓存转换旁路缓存(Translation Lookaside Buffer,TLB)是MMU的核心部件,它缓存少量的虚拟地址与物理地址的转换关系,是转换表的Cache,因此也经常被称为“快表” 转换表漫游转换表漫游(Translation Table...
13 FrameBuffer设备
Updated2025-10-31|04-Linux03-内核开发
FrameBuffer设备
14 阻塞与非阻塞IO
Updated2025-10-31|04-Linux03-内核开发
Linux阻塞与非阻塞IO阻塞与非阻塞的区别 阻塞:在对fd执行IO操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足 非阻塞:在不能对fd进行IO操作时,并不挂起,它要么放弃,要么不停地查询,直至可以进行操作为止 应用层的代码上两者的区别: 1234567// 阻塞IOchar buf;fd = open("/dev/ttyS1", O_RDWR);...res = read(fd,&buf,1);// 只有读到数据了才会返回 if(res==1) printf("%c\n", buf); 12345678// 非阻塞IOchar buf;fd = open("/dev/ttyS1", O_RDWR|O_NONBLOCK);...while(read(fd,&buf,1)!=1){continue;} /* 串口上无输入也返回,因此要循环尝试读取串口...
1…678…13
avatar
Li Ruiqi
总有低谷
Articles
127
Tags
0
Categories
17
Follow Me
Categories
  • 01-计算机基础八股12
  • 02-开发工具12
    • CMake7
  • 03-C++14
  • 04-Linux52
    • 01-Linux基本操作8
    • 02-系统移植9
    • 03-内核开发24
    • 04-应用开发8
    • 05-安卓开发3
  • 05-MCU28
    • 01-FreeRTOS7
    • 02-STM329
    • 03-MSP4304
    • 04-LVGL4
  • 06-嵌入式硬件5
  • 07-RISC-V4
Website Info
Article Count :
127
Unique Visitors :
Page Views :
Last Update :
©2019 - 2025 By Li Ruiqi
Framework Hexo|Theme Butterfly
人因梦想而伟大