现在可以把来源标清楚了。先说关键结论:
你现有的"正点原子Linux第1~4期"和购买课程,基本能覆盖测试A的驱动部分;但两套目录里都没有系统讲解TCP Socket客户端/服务器。第二步需要额外看正点原子官方的"嵌入式Linux C应用编程",它是独立课程,不属于传统第1~4期。
也就是说,不是你没找到,而是课程体系本来就把"Linux应用编程"和"Linux驱动"分开了。正点原子官方资料也分别列出Linux C应用指南和Linux驱动指南。官方资料说明
第一步:环境和Linux基本操作
主要看:正点原子第一期
课程名称:
第一期 手把手教你学Linux之Ubuntu入门篇
建议观看:
- 第1~5讲:电脑、VMware、Ubuntu和USB设备
- 第6.1~6.2讲:终端和Shell命令
- 第7讲:软件安装
- 第8讲:Linux文件系统
- 第10讲:压缩和解压
- 第11~13讲:用户、权限和链接
- 第14讲:Vim
- 第15讲:Linux C编程
- 第16~17讲:Make与Makefile
- 第18~19讲:Shell脚本
如果你的Ubuntu已经装好,第1~5讲可以快速浏览。正点原子第一期共20集,公开目录包含上述内容。第一期课程
实际操作看:购买课程第1份
正式课程目录 (1).json
观看路径:
text
前置环境准备
└─ 环境搭建jetson
├─ 虚拟机
├─ 刷整机
├─ SDK编译烧写
├─ 网络通讯
└─ 内核开发调试
├─ 应用层调试内核
├─ 内核模块调试
└─ 设备树调试
第一步的达标任务:
- Ubuntu能够正常编译C程序;
- Ubuntu能连接Jetson Nano;
- 能向Jetson传输文件;
- 能在Jetson运行交叉编译出来的程序;
- 能看到串口或SSH终端;
- 能找到Jetson内核源码、设备树和模块编译环境。
第二步:Linux应用编程
测试A需要两部分:文件IO与多线程、TCP Socket。
2.1 文件IO和多线程:看购买课程第3份
正式课程目录 (3).json
文件IO
观看路径:
text
驱动初级
└─ 阻塞非阻塞 同步异步
├─ 溯源
│ └─ 并发与文件IO
└─ 文件IO
├─ 标准输入输出
├─ 阻塞读
└─ 非阻塞读
多线程
观看路径:
text
驱动初级
└─ 并发控制
└─ 多线程
├─ 最简多线程
├─ 互斥锁
│ ├─ 最简
│ ├─ 多线程抢票
│ └─ 线程安全
├─ 信号量
├─ 自旋锁
└─ 读写锁
为了完成测试A,优先看:
- 最简多线程
- 互斥锁最简
- 多线程抢票
- 线程安全
- 信号量
用户态测试暂时不需要深入自旋锁和读写锁。
2.2 TCP Socket:现有1~4期没有完整覆盖
购买课程只有:
text
驱动高级
└─ 网络通讯
├─ 流媒体
├─ 网络协议
├─ 抓包分析
├─ Linux网络框架
└─ 网卡驱动
这部分偏网络原理和网卡驱动,不等于测试A需要的Socket客户端/服务器编程。
正点原子传统1~4期也没有系统讲TCP多线程服务器,所以需要增加一门免费的官方内容:
正点原子 嵌入式Linux C应用编程
只需要学习其中:
- 文件IO基础
- Linux线程
- 线程同步
- 网络基础
- Socket编程
- TCP客户端
- TCP服务器
如果B站这套视频的网络部分不完整,就配合正点原子官方的《Linux C应用编程指南》学习。官方手册明确覆盖文件IO、进程、线程和线程同步。Linux C应用编程手册
这一阶段只需要掌握以下函数:
c
// 线程
pthread_create();
pthread_join();
pthread_detach();
pthread_mutex_init();
pthread_mutex_lock();
pthread_mutex_unlock();
// TCP服务器
socket();
bind();
listen();
accept();
recv();
send();
close();
// TCP客户端
socket();
connect();
send();
recv();
close();
第二步的练习顺序:
- 一个客户端连接一个服务器;
- 客户端向服务器发送字符串;
- 服务器回复字符串;
- 三个客户端同时连接;
- 每次
accept()成功后创建一个线程; - 每个线程独立处理一个客户端;
- 客户端断开后,线程释放资源。
这一步暂时完全不接GPIO、I²C和SPI。
第三步:驱动公共基础和GPIO
主要看:购买课程第3份
顺序必须这样看:
text
驱动初级
├─ 内核模块
├─ 字符设备
├─ 平台设备
│ ├─ 最简
│ ├─ 改造字符设备成平台设备
│ ├─ 控制GPIO通用化
│ ├─ 设备树自定义属性
│ ├─ GPIO子系统
│ └─ 管脚控制子系统
具体重点:
内核模块
学习:
- 模块入口和出口
- 模块编译
insmodrmmodlsmoddmesgprintk
字符设备
学习:
- 设备号
cdevfile_operationsopenreadwriterelease- 创建设备节点
- 用户应用通过
/dev/xxx访问驱动
platform和设备树
学习:
- platform device与platform driver
compatibleproberemove- 设备树节点
- 驱动与设备的匹配过程
- 从设备树获取GPIO资源
GPIO
购买课程的准确路径:
text
驱动初级
└─ 平台设备
└─ GPIO子系统
├─ GPIO驱动
├─ GPIO库
├─ GPIO设备树
├─ GPIO芯片驱动
└─ 点多个灯
辅助看:正点原子第四期
按照章节名称看:
- Linux驱动开发与裸机开发区别
- 字符设备驱动基础
- 第一个Linux驱动
- Linux LED灯驱动
- Linux新字符设备驱动
- Linux设备树
- GPIO LED驱动
- platform驱动
不用同时把两套全部看一遍。建议:
- 先看正点原子,快速理解基本框架;
- 再看购买课程,理解Jetson适配和更完整的驱动模型;
- 最终只在Jetson Nano上动手。
第三步达标任务:
- 写一个GPIO字符设备驱动;
- 生成
/dev/gpio_test; - 用户程序向设备写入
1点灯; - 写入
0灭灯; - 加载、卸载和重复测试无异常。
第四步:I²C和SPI驱动
4.1 I²C:主要看购买课程
路径:
text
驱动初级
└─ I2C设备
├─ 框架源码
│ ├─ 设备树帮助文档
│ ├─ 设备树
│ └─ I2C总线驱动
├─ 陀螺仪MPU6050
├─ OLED屏控制
└─ 小车马达控制
测试A不必把所有案例都做完。推荐选一个真实I²C器件,例如MPU6050。
学习重点:
i2c_driveri2c_clientproberemove- 设备树
- 从机地址
i2c_transfer- 寄存器读写
- 用户态测试程序
辅助参考正点原子第四期第22章:
- 第22.1讲:I²C适配器驱动框架
- 第22.2讲:I²C设备驱动框架
- 第22.3~22.6讲:AP3216C驱动与测试
4.2 SPI:看正点原子第四期
你买的四份课程目录中没有SPI专题,所以SPI主要使用正点原子第四期第23章:
- 第23.1讲:SPI控制器驱动详解上
- 第23.2讲:SPI控制器驱动详解下
- 第23.3讲:SPI设备驱动框架与设备树
- 第23.4讲:ICM20608驱动框架
- 第23.5讲:寄存器读写
- 第23.6讲:驱动完善和测试APP
- 第23.7讲:片选引脚勘误
学习重点:
spi_driverspi_deviceproberemovespi_messagespi_transferspi_sync- SPI模式
- 速率
- 片选
- 设备树
注意:课程使用i.MX6ULL,最后必须将设备树和硬件适配改成Jetson Nano版本。
第四步达标任务:
- I²C驱动能够读写一个实际器件;
- SPI驱动能够读写一个实际器件;
- 分别提供
/dev/i2c_test和/dev/spi_test; - 本地测试程序可以稳定访问。
第五步:整合测试A
这一部分没有对应视频,需要将前四步代码组合起来。
第一轮:只做TCP
text
Client 1 ─┐
Client 2 ─┼─→ Jetson TCP Server
Client 3 ─┘
三个客户端能同时连接、通信和退出。
第二轮:只做驱动
在Jetson本机执行:
text
gpio_test_app → /dev/gpio_test
i2c_test_app → /dev/i2c_test
spi_test_app → /dev/spi_test
三个驱动分别运行正常。
第三轮:网络控制驱动
服务器收到命令后操作设备文件:
text
LED_ON
LED_OFF
I2C_READ
I2C_WRITE
SPI_READ
SPI_WRITE
建议统一协议:
text
设备类型 命令 参数
例如:
text
GPIO WRITE 1
I2C READ 0x75
SPI READ 0x00
第四轮:整理交付物
至少保留:
- 客户端源码
- 服务器源码
- 三个驱动源码
- 设备树修改
- Makefile
- 编译过程
- 加载和卸载步骤
- 测试截图
dmesg日志- 问题及解决记录
最终学习来源总表
| 步骤 | 主要来源 | 具体内容 |
|---|---|---|
| 1 环境基础 | 正点第一期 | 命令、Vim、GCC、Makefile |
| 1 Jetson环境 | 买课第1份 | Jetson、SDK、串口、网络、内核和设备树调试 |
| 2 文件IO | 买课第3份 | 阻塞非阻塞 → 文件IO |
| 2 多线程 | 买课第3份 | 并发控制 → 多线程 |
| 2 TCP Socket | 正点官方Linux C应用编程 | 客户端、服务器、多线程网络通信 |
| 3 驱动基础 | 买课第3份 | 模块、字符设备、platform、GPIO |
| 3 辅助理解 | 正点第四期前半部分 | 字符设备、LED、设备树、platform |
| 4 I²C | 买课第3份 | I²C设备章节 |
| 4 SPI | 正点第四期第23章 | SPI框架、设备树、ICM20608 |
| 5 综合联调 | 自己完成 | TCP多线程与三个设备驱动整合 |
所以你现在的开课顺序是:
text
正点第一期必要部分
→ 买课第1份Jetson环境
→ 买课第3份文件IO和多线程
→ 补正点Linux C应用编程中的TCP Socket
→ 买课第3份内核模块、字符设备、platform、GPIO
→ 买课第3份I²C
→ 正点第四期第23章SPI
→ 完成测试A
其中最容易误解的一点是:正点原子传统第1~4期不等于完整Linux应用编程课程。测试A中的TCP多线程,需要另外补正点原子的Linux C应用编程内容。