十二、驱动开发环境准备

一、虚拟机安装和配置

1.由于想用Clangd实现Vscode + Clangd的代码精确跳转,所以需要一个较高的Linux内核版本,但是又不想系统占用太大的空间,因此操作系统镜像选择Debian-12服务器版。

2.虚拟机配置3个网卡,分别实现虚拟机与主机共享上网,主机连接虚拟机,开发板连接虚拟机:

ens33: NAT,用于与主机共享上网,IP地址自动配置。

ens37:Host-Only,用于主机连接虚拟机,实现SSH和Samba共享等功能,IP = 192.168.189.100

ens38:Brige(复制物理网络连接状态),与主机的有线网卡(USB网卡)+ 开发板组建局域网络。USB网卡静态IP = 192.168.1.1, 开发板网卡静态IP = 192.168.1.2, ens38网卡静态IP = 192.168.1.100。

由于我的主机电脑没有固定的有线网口,所以用的USB转接网口,其插拔会影响主机的网络状态,故单独组件了一个brige网络,以免其插拔影响到虚拟机上网功能或者主机与虚拟机的连接。这样就将三个作用不同的网络隔离开,它们相互隔离,一个网络出问题也不会影响到其它网络域的功能。

二、内核代码阅读环境

1.阅读代码使用Vscode + Source Insight双开:Vscode配合Clangd插件实现C语言代码精准跳转,SI用于阅读汇编以及分析函数调用上下文。

2.拷贝一份内核代码,单独对其进行编译,生成Vscode Clangd插件需要的信息,方便在阅读时进行C代码的精确跳转。

3.进入内核源码目录后,执行如下几个命令,编译linux内核源码:

bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
bear -- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j2

编译完成之后会在内核源码顶层目录中生成compile_commands.json文件,clangd就使用这个文件里面保存的构建信息来实现C代码精准跳转。

使用bear -- make要比直接使用make编译要慢一些,因为要记录编译信息到compile_commands.json文件中。

4.windows上的Vscode安装Remote SSH插件和Clangd插件,并且需要给Debian12虚拟机也安装Clangd服务以及Vscode Server服务,具体方法可以参考其它专门的相关博客。

5.在windows系统上使用Vscode使用Remote SSH远程打开Debian12上刚刚编译的内核源码目录,如果Clangd工作正常,其会自动检测compile_commands.json文件,并实现代码点击精准跳转。

6.在linux内核源码根目录下新建.vscode文件夹,里面新增一个settings.json文件,输入不需要显示和检索的文件后缀如下:

bash 复制代码
{
    "search.exclude": {
        "**/*.o": true,
        "**/*.su": true,
        "**/*.cmd": true,
        "**/*.txt": true,
        "**/*.idx": true,
        "**/*.ihex": true,
    },
    "files.exclude": {
        "**/*.o": true,
        "**/*.su": true,
        "**/*.cmd": true,
        "**/*.txt": true,
        "**/*.idx": true,
        "**/*.ihex": true,
    }
}

这样可以排除掉一些非源码文件类型的干扰,让代码阅读工程更简洁。

7.在SI中新建Linux内核源码阅读工程,选择性添加源码目录和文件后缀,尽量减少无用的目录和文件,这样可以加快工程的同步和检索速度。

三、镜像引导启动

1.使用mfgtool工具将uboot烧录进EMMC后,设置开发板为从EMMC启动,进入uboot。

2.Linux内核镜像(也可从EMMC加载)和设备树通过TFTP下载,根文件系统使用NFS,所以uboot中的bootcmd和bootargs参数设置如下:

bash 复制代码
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.100:/home/david/share/nfs/rootfs,vers=3,tcp ip=192.168.1.2:192.168.1.100:192.168.1.1:255.255.255.0::eth0:on'
saveenv

由于debian12内核版本较高,其不支持NFS V2协议了,所以uboot中无法使用nfs命令下载文件。但是板子的linux内核支持NFS V3,所以仍然可以挂载网络文件系统,需要在挂载命令中加上vers=3的参数,显式指定使用NFS V3协议。

相关推荐
VernonJsn14 小时前
visual studio 2022的windows驱动开发
ide·驱动开发·visual studio
嵌入式郑工21 小时前
RK3566 LubanCat 开发板 USB Gadget 配置完整复盘
linux·驱动开发·ubuntu
雾削木2 天前
树莓派 ESPHome 固件编译与烧录全攻略(解决超时与串口识别问题)
驱动开发
春日见3 天前
win11 分屏设置
java·开发语言·驱动开发·docker·单例模式·计算机外设
DarkAthena3 天前
【GaussDB】手动编译不同python版本的psycopg2驱动以适配airflow
驱动开发·python·gaussdb
松涛和鸣4 天前
DAY66 SPI Driver for ADXL345 Accelerometer
linux·网络·arm开发·数据库·驱动开发
嵌入式郑工4 天前
# RK3576 平台 RTC 时钟调试全过程
linux·驱动开发·ubuntu
GS8FG4 天前
针对Linux,RK3568平台下,I2C驱动的一点小小的领悟
linux·驱动开发
一路往蓝-Anbo4 天前
第 4 篇:策略模式 (Strategy) —— 算法的热插拔艺术
网络·驱动开发·stm32·嵌入式硬件·算法·系统架构·策略模式
A-花开堪折4 天前
RK3568 Android 11 驱动开发(五):串口驱动适配
驱动开发