十二、驱动开发环境准备

一、虚拟机安装和配置

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

相关推荐
保加利亚的风37 分钟前
【Java】Spring Boot Event事件驱动开发:使用 ApplicationEvent 实现解耦通信
java·驱动开发·spring boot
询问QQ:688238862 小时前
带平衡电抗器的双反星形可控整流电路的Matlab仿真报告:在电镀行业中三相桥式电路的电源设计与...
驱动开发
python百炼成钢2 小时前
42.Linux INPUT 子系统驱动
linux·驱动开发
不知所云,3 小时前
3. cmake 和 Ninja安装
驱动开发·makefile·make·构建工具·ninja
python百炼成钢3 小时前
43.Linux LCD驱动
java·linux·运维·驱动开发
偶像你挑的噻13 小时前
15-Linux驱动开发-PWM子系统
linux·驱动开发·stm32·嵌入式硬件
偶像你挑的噻2 天前
12-Linux驱动开发- SPI子系统
linux·驱动开发·stm32·嵌入式硬件
nuoxin1142 天前
GSV1011-富利威-HDMI芯片选型
arm开发·驱动开发·fpga开发·ffmpeg·射频工程
快乐的学习2 天前
开源相关术语及提交commit关键字总结
驱动开发·开源