十二、驱动开发环境准备

一、虚拟机安装和配置

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协议。

相关推荐
secondyoung20 小时前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
不怕犯错,就怕不做1 天前
RK linux在buildroot中如何添加linux命令
linux·驱动开发·嵌入式硬件
喵叔哟1 天前
从 Prompt 到可执行规格:认识 GitHub Spec Kit
驱动开发·prompt·github
飞多学堂2 天前
每日开源硬件精选简报 2026-09-11
驱动开发·开源·开源硬件·硬件开源·电子制作
码农客栈2 天前
Linux I2C驱动实验
linux·运维·驱动开发
智者知已应修善业2 天前
【如何将此图变为000到101就返回】2026-4-7
驱动开发·经验分享·笔记·硬件架构·硬件工程
国产化创客3 天前
创客开发入门(七)Arduino ESP32-WS2812开发
驱动开发·单片机·物联网·智能硬件
ItJavawfc4 天前
Linux驱动-RTC-RX8010集成-驱动开发-系统移植-移植RX8010驱动
驱动开发·rtc·8010rtc 驱动移植
sukalot5 天前
windows 驱动实例分析系列: HidHide驱动分析-HidHideClient 篇(中)
windows·驱动开发
HRTOS7 天前
HRTOS 4.0 驱动库:06_Storage 存储设备驱动——24C02 EEPROM与I²C驱动开发
c语言·驱动开发·嵌入式硬件·51单片机