十二、驱动开发环境准备

一、虚拟机安装和配置

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

相关推荐
世微 如初14 天前
AP5125大功率LED恒流驱动实战:地摊灯项目从原理图到调试笔记
驱动开发·芯片·led电源驱动·降压恒流ic
ScilogyHunter14 天前
Zephyr串口驱动开发及构建完全指南
驱动开发·uart·zephyr
_Emma_14 天前
【DRM&Graphic】Linux图形与显示框架
linux·驱动开发·图形渲染·显示器
董厂长14 天前
Loop Engineering:停止手动提示,开始设计自动提示的系统
大数据·人工智能·驱动开发·llm
Saniffer_SH15 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
暮云星影15 天前
全志linux开发屏幕适配(二)`HDMI`驱动适配说明
linux·arm开发·驱动开发
charlie11451419115 天前
嵌入式Linux驱动开发——从轮询到中断
linux·开发语言·驱动开发·嵌入式
暮云星影15 天前
瑞芯微rk3566开发FIT Secure Boot
linux·arm开发·驱动开发·安全
暮云星影15 天前
全志linux开发 USB接口设置
linux·arm开发·驱动开发
sukalot15 天前
windows显示驱动开发-CCD DDI的其它技术
windows·驱动开发