这门课解决什么问题

很多做单片机开发或应用层编程的人,转到嵌入式底层时最常卡在两件事:一是看着芯片手册和原理图不知道怎么对应到代码,二是写的驱动总在内核态崩溃却无从下手。这门课的定位就是把这块硬骨头啃下来,覆盖从看懂电路原理图、查阅 datasheet,到编写内核驱动并加载的完整链路。它不是泛泛讲 Linux 语法,而是聚焦在“怎么让一块具体硬件在 Linux 系统下跑起来”。如果你正卡在交叉编译环境搭不通、内核源码编译报错、设备树不知道怎么改,或者写了模块却加载不进去,这门课的实操演示能帮你把这些坑趟平。

适合什么基础与建议学习顺序

看这门课前,你需要有基本的 C 语言基础,写过简单的单片机程序或 Linux 应用,懂指针和结构体。完全零基础或没接触过 Linux 系统操作的话,建议先补这些再来看。拿到资料后,建议先看开头的行业特点与技能需求分析,确认自己是否真的要往这个方向转;接着直接跟着环境搭建部分,把交叉编译工具链、内核源码编译、tftp 加载内核和 nfs 挂载根文件系统这套开发环境跑通。这套环境是后续所有练习的前提,很多初学者卡在写代码阶段,其实问题出在环境没搭好。环境跑通后,再进入内核编程基础,从第一个内核模块的编写、编译到加载测试,跟着做一遍。

学完能独立做什么与资料配合方式

学完后,你应该能独立完成一个内核模块的编写、编译和加载调试,能看懂硬件原理图上的引脚连接,对照 datasheet 找到关键寄存器配置,并把这些硬件信息通过设备树传递给内核。具体来说,你能给一个简单的字符设备写出基本的驱动框架,在开发板上验证硬件功能。资料配合上,建议先通看一遍视频理解操作流程,再用 Source Insight 把内核源码工程建好,边看视频边在自己环境里复现每个步骤。关键操作如编译内核、修改设备树、加载模块,务必自己敲一遍,不要只看视频。遇到加载报错或内核 panic,回头查对应的编译选项和依赖配置,这个过程本身就是驱动调试能力的积累。


嵌入式Linux驱动开发体系化课程,从电路原理图到datasheet,到内核驱动开发完整技术栈

课程目录

*   01 Linux驱动编程初步/

  *   01 001_驱动程序开发的行业特点.mp4 05:27

  *   02 002_Linux驱动程序开发技能需求.mp4 22:09

  *   03 003_Linux驱动程序开发学习方法.mp4 12:14

  *   04 004_安装交叉编译工具.mp4 17:28

  *   05 005_编译内核源码.mp4 07:26

  *   06 006_tftp加载内核、设备树.mp4 24:24

  *   07 007_nfs方式挂载根文件系统.mp4 11:04

  *   08 008_source insight创建内核源码工程.mp4 12:47

*   02 内核编程基础/

  *   01 009_第一个内核模块.mp4 24:42

  *   02 010_第一个内核模块的说明.mp4 42:07

  *   03 011_printk.mp4 42:15

  *   04 012_导出符号.mp4 26:43

  *   05 013_模块参数.mp4 38:10

  *   06 014_系统调用的实现.mp4 53:39

*   03 字符设备驱动编程框架/

  *   01 015_字符设备核心数据结构.mp4 13:07

  *   02 016_静态分配设备号.mp4 43:42

  *   03 017_动态分配设备号.mp4 24:47

  *   04 018_关于cdev的API.mp4 15:13

  *   05 019_编程实例.mp4 29:19

  *   06 020_用户空间调用驱动函数.mp4 17:28

  *   07 021_实现原理.mp4 17:54

  *   08 022_一个cdev管理多个字符设备.mp4 26:32

*   04 gpio子系统/

  *   01 023_硬件分析.mp4 30:18

  *   02 024_gpio子系统 API简介.mp4 17:51

  *   03 025_编程实例一.mp4 20:25

  *   04 026_编程实例二.mp4 22:16

*   05 内核空间和用户空间的数据交换/

  *   01 027_数据交换的方式.mp4 19:35

  *   02 028_编程实例.mp4 31:42

*   06 ioctl/

  *   01 029_ioctl用户空间编程.mp4 21:05

  *   02 030_ioctl驱动编程.mp4 12:50

  *   03 031_request的格式一.mp4 33:47

  *   04 032_request的格式二.mp4 41:38

*   07 设备文件的自动创建/

  *   01 033_设备文件的自动创建.mp4 41:17

*   08 platform总线/

  *   01 034_总线驱动模型三要素.mp4 29:53

  *   02 035_platform总线.mp4 25:58

  *   03 036_platform总线编程实例一.mp4 14:58

  *   04 037_platform总线编程实例二.mp4 45:12

  *   05 038_platform总线编程实例三.mp4 57:58

  *   06 039_设备和驱动的匹配方式.mp4 18:20

  *   07 040_platform总线的优势.mp4 08:54

*   09 设备树/

  *   01 041_什么是设备树.mp4 22:26

  *   02 042_设备树节点.mp4 36:02

  *   03 043_设备树属性.mp4 14:05

  *   04 044_编写设备树节点.mp4 15:46

  *   05 045_内核对设备树的解析.mp4 28:09

  *   06 046_找节点.mp4 37:32

  *   07 047_找属性.mp4 19:50

  *   08 048_找value.mp4 46:57

*   10 设备树版本的LED驱动程序/

  *   01 049_编写设备树节点.mp4 56:52

  *   02 050_LED驱动编程一.mp4 46:21

  *   03 051_LED驱动编程二.mp4 07:11

  *   04 052_LED驱动编程三.mp4 48:40

  *   05 053_LED驱动编程四.mp4 20:48

*   11 Linux中断处理/

  *   01 054_裸板中按键中断处理.mp4 29:14

  *   02 055_内核中提供的中断相关的API.mp4 36:28

  *   03 056_编写按键对应的设备树节点.mp4 45:38

  *   04 057_按键驱动编程一.mp4 22:00

  *   05 058_按键驱动编程二.mp4 27:00

  *   06 059_Linux中断子系统.mp4 34:53

  *   07 060_中断处理函数的特点.mp4 11:54

*   12 中断底半部机制/

  *   01 061_软中断.mp4 31:00

  *   02 062_tasklet的使用.mp4 26:49

  *   03 063_tasklet使用的注意事项.mp4 14:01

  *   04 064_工作队列的使用.mp4 22:25

  *   05 065_与tasklet的对比分析.mp4 16:12

  *   06 066_delayed_work.mp4 23:07

*   13 Linux内核中的定时与延时/

  *   01 067_系统时钟中断.mp4 30:11

  *   02 068_内核定时器API.mp4 20:58

  *   03 069_定时器编程实例.mp4 44:31

  *   04 070_内核中的延时.mp4 05:16

  *   05 071_按键去抖.mp4 51:27

*   14 内核的竞态与并发/

  *   01 072_按键设备的用户空间访问.mp4 23:08

  *   02 073_按键设备独占访问的简单实现.mp4 28:43

  *   03 074_简单实现中存在的BUG.mp4 18:30

  *   04 075_竞态与并发的基本概念.mp4 07:46

  *   05 076_中断屏蔽.mp4 16:12

  *   06 077_原子操作.mp4 18:40

  *   07 078_自旋锁.mp4 18:38

  *   08 079_自旋锁使用的注意事项.mp4 20:43

  *   09 080_信号量.mp4 26:44

*   15 IO模型/

  *   01 081_阻塞IO基础.mp4 22:45

  *   02 082_阻塞IO编程.mp4 39:27

  *   03 083_阻塞IO原理.mp4 16:20

  *   04 084_非阻塞IO.mp4 26:38

  *   05 085_支持多路复用.mp4 24:12

  *   06 086_select实现原理分析.mp4 21:59

  *   07 087_poll实现原理分析.mp4 07:31

  *   08 088_epoll实现原理分析.mp4 26:42

  *   09 089_信号驱动IO.mp4 42:01

  *   10 090_异步IO.mp4 11:56

*   16 内存管理/

  *   01 091_高端内存&低端内存.mp4 28:07

  *   02 092_动态分配内存API.mp4 19:38

  *   03 093_内核中的出错处理.mp4 23:02

  *   04 094_IO内存基本概念.mp4 21:43

  *   05 095_LED驱动硬件分析.mp4 19:46

  *   06 096_ioremap控制LED编程实例.mp4 27:43

  *   07 097_mmap控制硬件.mp4 57:09

*   17 input子系统/

  *   01 098_什么是input子系统.mp4 39:40

  *   02 099_input子系统的使用方式.mp4 15:34

  *   03 100_input版按键设备树节点.mp4 30:11

  *   04 101_实现和platform_driver的匹配.mp4 14:34

  *   05 102_获取设备树节点中的硬件信息.mp4 49:54

  *   06 103_注册input_dev.mp4 48:17

  *   07 104_硬件相关代码实现.mp4 41:33

  *   08 105_通过hexdump访问设备.mp4 38:33

  *   09 106_编程访问输入设备.mp4 16:17

  *   10 107_input子系统的框架分析.mp4 29:33

*   18 I2C设备驱动/

  *   01 108_裸板SI7006驱动实现.mp4 33:47

  *   02 109_IIC总线驱动的启用.mp4 55:34

  *   03 110_IIC设备驱动框架.mp4 22:26

  *   04 111_IIC设备的添加.mp4 12:28

  *   05 112_设备和驱动的匹配.mp4 16:12

  *   06 113_读取电子串号.mp4 30:00

  *   07 114_读取温湿度值.mp4 41:53

  *   08 115_编写IIC驱动测试程序验证.mp4 14:38

  *   09 116_GPIO模拟I2C通信.mp4 16:11

*   19 SPI设备驱动/

  *   01 117裸板数码管驱动实现.mp4 50:22

  *   02 118_SPI总线驱动的启用.mp4 46:21

  *   03 119_SPI设备驱动框架.mp4 14:15

  *   04 120_SPI设备的添加.mp4 16:21

  *   05 121_设备和驱动的匹配.mp4 12:43

  *   06 122_spi_write函数的使用.mp4 07:23

  *   07 123_按照混杂子系统框架完善驱动程序.mp4 36:54

  *   08 124_编写SPI驱动测试程序验证.mp4 02:34

  *   09 125_GPIO模拟SPI通信.mp4 18:39

*   20 块设备驱动/

  *   01 126_块设备驱动编程基础.mp4 23:03

  *   02 127_块设备驱动的框架.mp4 12:05

  *   03 128_块设备驱动编程一.mp4 55:52

  *   04 129_块设备驱动编程二.mp4 24:22

  *   05 130_块设备驱动编程三.mp4 38:01

  *   06 131_块设备驱动的测试.mp4 12:12

*   21 网络设备驱动/

  *   01 132_网卡驱动编程基础.mp4 17:51

  *   02 133_网卡驱动框架编程.mp4 34:13

  *   03 134_虚拟网卡数据的收发.mp4 39:36