09 MISC设备驱动框架
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; ...
11 Linux内核中断
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...
04 网络编程
...
06 platform设备驱动框架
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 ...
08 GStreamer
GStreamer基本概念GStreamer是一个跨平台的流媒体框架,采用基于管道的插件化架构,支持音视频采集、编解码、渲染等全流程处理。应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。例如摄像头采集(v4l2src)、视频编码(nvv4l2h264enc)等模块可灵活拼接,组成流水线 ElementSource 元件(数据源)产生媒体流的元素 文件源:filesrc (从文件读取) 设备源:v4l2src (摄像头, Video4Linux2), alsasrc (音频输入), pulsesrc (PulseAudio输入), audiotestsrc, videotestsrc (测试源) 网络源:udpsrc, tcpclientsrc, rtmpsrc, rtspclientsrc 特殊硬件源 (Jetson/NVIDIA):nvarguscamerasrc,...
20 sysfs
sysfs定义sysfs 是 Linux 内核提供的一个 虚拟文件系统(类似 /proc),挂载在 /sys 下 作用: 展示内核对象(kobject)及其属性给用户空间 提供用户态访问和控制硬件及内核状态的接口 支持驱动和设备管理、模块信息查看、电源管理等 特点: 虚拟文件系统,不占用实际磁盘空间 每个 kobject 对象在 sysfs 中对应一个目录 属性(attribute)以文件的形式暴露,读写这些文件会触发内核的回调函数 结构 目录 作用 /sys/class/ 按设备类别(class)组织的设备,如 net、gpio、leds 等 /sys/bus/ 按总线类型组织设备,如 pci、usb、platform 等;还包含驱动/设备信息 /sys/devices/ 所有 struct device...
10 Linux内核定时器
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; /*...
03 文件IO
文件IO Linux下,一切皆文件。这句话指的是,Linux系统中,将对所有输入/输出资源(文件、管道、Socket、硬件设备)的操作都抽象成了对文件的操作。所以学习文件I/O的相关API很重要 1.文件描述符在Linux系统中,使用open()系统调用打开一个I/O资源后,会返回一个非负整数,这个非负整数就是==文件描述符==fd。后续所有的对于该资源的操作,都需要这个文件描述符。 这里我使用I/O资源而不是文件,因为打开像socket这样的资源时,并不是真的打开了一个文件,但是也会返回一个文件描述符。 Linux内核中,对每一个进程都维护一个打开文件表(struct...
09 删掉某个可执行文件相关依赖
删掉某个可执行文件相关依赖我们在用apt-get装了某个可执行文件/库之后,可能又想删掉它,可能第一时间想到的方式是用rm *的方式删,但是这样容易删不干净。既然文件是由apt-get安装的,拿再由包管理工具删掉就好了 寻找待卸载文件属于哪个包 以qemu-system-riscv64为例 法1:检查系统中通过 apt 安装的 QEMU 相关包 1apt list --installed | grep qemu 法2:查看具体包名 1dpkg -S /usr/bin/qemu-system-riscv64 卸载包12sudo apt-get remove qemu-system-riscv # 保留配置文件sudo apt-get purge qemu-system-riscv # 彻底删除(推荐)
19 有线以太网
有线以太网(Ethernet) Etheret这个词一般指的就是有线以太网,若涉及无线网络,通常会使用Wi-Fi或其他明确术语 嵌入式网络概述之前总是听到“网卡”这个词,实际上他是个非常笼统的概念包含了多个硬件。实际上需要以下的具体硬件来实现Ethernet: MAC控制器:它负责OSI体系中数据链路层的工作(以太网帧的封装、差错与流量控制、MAC地址寻址…) MAC可能位于SoC的内部,也可能外接。如果说一个SoC具备网络功能,一般指的SoC内部有MAC外设 PHY(物理层收发器)芯片:它负责OSI体系中物理层的工作: PHY一般位于SoC外部 信号转换:MAC层的数字信号 <—->...








