RK3568学习笔记
第1章 Linux镜像烧录
更新和烧录镜像方法
1.0 查看交叉编译工具
aarch64-linux-gnu-gcc --version
1.1 查看编译脚本选项
lubancat@lubancat-vm:~/LubanCat_SDK$ pwd
/home/lubancat/LubanCat_SDK
lubancat@lubancat-vm:~/LubanCat_SDK$ ./build.sh --help
1.2 选择目标板卡配置
./build.sh lunch
“lite” = 无桌面(轻量命令行系统)
“xfce” = 带桌面版
“xfce-full” = 桌面完整版(包含常用软件包)
目的 | 命令示例 | 说明 |
---|---|---|
查看当前支持的开发板配置 | ./build.sh lunch | 类似 Android 的 lunch ,列出并选择板卡 |
构建 U-Boot | ./build.sh uboot | 编译 U-Boot 引导程序 |
构建 Kernel | ./build.sh kernel | 编译 Linux 内核 |
构建 RootFS(默认 buildroot) | ./build.sh rootfs | 编译根文件系统 |
构建完整系统镜像 | ./build.sh all | 同时编译 uboot + kernel + rootfs |
打包固件镜像 | ./build.sh firmware | 将所有镜像文件打包成可烧录镜像 |
构建并保存所有镜像 | ./build.sh allsave | 一键构建+打包+保存 |
清理全部编译结果 | ./build.sh cleanall | 清理所有生成的镜像与中间文件 |
1.3 编译所有
# 1. 选择目标板卡配置
sudo ./build.sh lunch# 2. 编译所有组件
sudo ./build.sh all# 3. 打包固件
sudo ./build.sh firmware# 4.更新镜像
sudo ./build.sh updateimg
第2章 Linux模块化编程
第3章 Linux中断子系统
第4章 Linux并发与竞争
第5章 Linux字符设备驱动
5.1 ioctl函数
根据经验,ioctl
通常用于传递 控制命令和少量数据,而 大量数据传输 则应使用 read
/write
或 mmap
。
5.1.1 ioctl函数框架
5.1.2 ioctl命令宏详解
(1) 命令格式
(2)生成命令的命令宏(应用层使用)
命令宏 | 方向 | 参数 | |
_IO(type,nr) | 没有参数的命令 |
| |
_IOR(type,nr,size) | 该命令是从驱动读取数据 |
| |
_IOW(type,nr,size) | 该命令是应用向驱动写数据 |
| |
_IOWR(type,nr,size) | 双向数据传输 |
|
(3)拆解命令的命令宏(驱动层使用)
1._IOC_TYPE(cmd)
—— 从命令中提取设备类型(幻数)
- 用途:提取命令中的
type
字段(也称“幻数”,magic number)。- 返回值:一个字符(
char
),用于标识设备或驱动类别。- 典型用法:防止不同设备的命令码冲突。驱动可通过此值验证命令是否属于本设备。
if (_IOC_TYPE(cmd) != 'k')return -ENOTTY; // 非本设备命令
2. _IOC_DIR(cmd)
—— 从命令中提取方向
- 用途:提取
ioctl
命令的数据传输方向。- 返回值:一个整数,表示数据流向,可能为:
_IOC_NONE
:无数据传输_IOC_WRITE
:用户空间 → 内核空间(写)_IOC_READ
:内核空间 → 用户空间(读)_IOC_READ | _IOC_WRITE
:双向传输- 典型用法:驱动中判断是否需要读/写用户缓冲区,进行权限检查。
if (_IOC_DIR(cmd) & _IOC_READ)access_ok(VERIFY_WRITE, arg, _IOC_SIZE(cmd));
3._IOC_NR(cmd)
—— 从命令中提取命令序号
- 用途:提取命令的编号(
nr
),即该设备下的第几个命令。- 返回值:一个整数(0~255),表示命令的序号。
- 目的:在驱动的
switch
语句中用于分发不同的命令处理逻辑。switch (_IOC_NR(cmd)) { case 0:// 处理 RESET 命令break; case 1:// 处理 GET_STATUS 命令break; }
4._IOC_SIZE(cmd)
—— 从命令中提取数据大小
- 用途:提取命令中指定的数据结构大小(以字节为单位)。
- 返回值:一个整数,表示
size
参数的值(即sizeof(struct xxx)
)。- 目的:用于验证用户传入的缓冲区大小是否合法,配合
copy_to_user
/copy_from_user
使用。if (_IOC_SIZE(cmd) > sizeof(local_struct))return -EINVAL;
5.总结
宏 | 用途 | 典型用途 |
---|---|---|
_IOC_DIR(cmd) | 提取数据传输方向 | 判断是读、写还是双向 |
_IOC_TYPE(cmd) | 提取设备类型(幻数) | 验证命令是否属于本设备 |
_IOC_NR(cmd) | 提取命令序号 | switch 分发具体操作 |
_IOC_SIZE(cmd) | 提取数据大小 | 缓冲区边界检查、内存操作 |
第xxx章 Platform虚拟总线
第xxx章 设备树
参考文章