移植pmon要比移植uboot难吗?
和 uboot 移植相比,给开发板移植 pmon 难吗?有什么区别呢。我们在移植 uboot 的时候,基本上是不 会在 uboot 的官网去下载纯净的 uboot 镜像的,而是用的半导体厂家提供的 bsp 包里面的 uboot。为什么要 这么做呢?并不是说 uboot 官网里面的 uboot 源码不能用,不能移植,而是 uboot 官网里面的 uboot 对相应的 CPU 的支持不是很好。你想哈,谁对 CPU 最熟悉呢?肯定是半导体厂家是不是,他们对自己的 CPU 肯定 是最熟悉的。所以他们提供的 bsp 里面的 uboot 是对他们的 CPU 支持最好的,驱动最全的。所以我们不会 在 uboot 官网去下载,然后在去移植。而且使用半导体厂家提供的 BSP 还有一个好处,就是移植非常简单。
就拿 uboot 移植来说,只需要基于半导体厂家的 BSP 来针对自己的开发板适配即可。所需要的工作并不多。
同理,在 LS2K1000 上我们使用的是 pmon,那这个 pmon 我们要去找原生的吗,显然不是。pmon 现在是龙 芯中科在进行维护,所以,龙芯中科提供的 pmon 会对自己的 CPU 支持的非常友好。基本上就是我们拿到 BSP 以后,稍加修改就可以完美的在开发板上来运行了。所以,pmon 的移植要比 uboot 的移植更加简单。
9.9.2 获取原厂 pmon 源码
源码 pmon 源码在:LS2K1000 开发板资料\12_原厂 BSP\1_pmon 源码
接着我们将 pmon 源码拷贝到 Ubuntu 虚拟机的任意目录下,然后按照手册 7.1 编译和 6.6 烧写 pmon 到开发板。可以发现,源码的 pmon 源码直接编译成功就可以在开发板上运行。非常友好。
9.9.3 配置 can 总线
我就进到 pmon 源码的 pmon-loongson3/Targets/LS2K/conf 路径下,使用命令 cp LS2K.dts LS2K.dts_back 备份一下设备树文件,如下图所示:
接着我们使用命令 vim LS2K.dts 打开设备树文件,找到 can0 和 can1 的设备节点,可以发现,在 BSP 里 面已经默认配置好了,不需要我们在额外配置,如下图所示:
接着我们来配置引脚的复用关系,通过 LS2K1000 的数据手册,可知地址 0x1fe10420 的第 16 到 17 位配置的是 can 引脚的复用关系,如下图所示:
通过上表可知,如果我们要把 GPIO 设置为 CAN 功能,我们需要将 16 到 17 位设置为 1,我们可以直接在 pmon 里面操作这个寄存器,比如使用在 Targets/LS2K/ls2k/tgt_machdep.c 文件中增加代码(volatile int *)0xbfe10420 |=(2<<16)将这俩位设置为 1,但是在 pmon 的 bsp 里面这些工作已经给我们做好了,只不过是没有编译进去而已。
在 Targets/LS2K/ls2k/tgt_machdep.c 文件的第 464 行使用了宏定义 PAI2 来决定包不包含 pai2.c 文件,如下图所示:
pai2.c 文件在路径 Targets/LS2K/ls2k/pai2.c 下,这个文件里面通过宏定义 SEL_CAN 来对 CAN 的管脚复用进行了配置,如下图所示:
所以我们是不是就不用在自己单独来添加代码了呢,我们只需要加上这 PAI2 和 SEL_CAN 这来个宏定义即可,我们打开 Targets/LS2K/conf/ls2k 文件,取消注释 option PAI2 并增加宏定义 option SEL_CAN,如下图所示:
然后我们重新编译 pmon 源码并烧写到开发板上,使用命令 devmem 0x1fe10420 来查看有没有成功将这俩个管脚的复用设置成 can,如下所示:
将 0x00131D49 换算成 2 进制,可以发现 16 到 17 位已经成功设置成了 1,所以这俩个 GPIO 已经成功被设置成 CAN。接着我们就可以来测试开发板的 CAN 功能了。
3.2.7 CAN 接口测试
开发板板载了两路 CAN 接口, 我们可以使用这两路 CAN 接口验证 CAN 的数据收发。首先我们使用电缆线连接 CAN1 和 CAN2(can 连接的时候: H 接 H、 L 接 L) , 如下图所示:
开发板上的两路 CAN 默认是关闭的, 我们在调试串口终端输入“ip link set can0 up type can bitrate
125000 triple-sampling on” 命令, 设置 CAN0 的波特率是 125000, 并打开 CAN0, 运行结果如下图所示:
然后我们在调试串口终端输入“
ip link set can1 up type can bitrate 125000 triple-sampling on” 命令, 设
置 CAN1 的波特率是 125000( CAN 总线在进行数据收发的时候,通信双方的波特率要设置成一致),并
打开 CAN1, 运行结果如下图所示:
接下来我们使用 CAN0 作为数据接收端, 我们需要在调试串口终端输入“candump can0 &” 命令, 运行结果如下图所示:
然 后 我 们 使 用 CAN1 作 为 数 据 发 送 端 , 我 们 在 调 试 串 口 终 端 输 入 “cansend can1 6A0#11.22.33.44.55.66.77.88”命令, 发送数据, 其中的 6A0 是帧 ID, #后面的是数据, 共 8 个字节。 运行结果如下图所示:
上图我们可以看到 CAN1 发送数据以后, 后台运行的 CAN0 接收程序收到了 CAN0 的数据, 并显示出来, 接收到的数据和发送的数据内容一致。
数据接收端和发送端也可以互换,可以参考上面的命令(主要是解释和发送程序的 CAN 接口设置对)。