移植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功能,需要将bit 16到17设置为1。我们可以直接在pmon中操作这个寄存器,比如在Targets/LS2K/ls2k中使用它/tgt_machdep.c 文件中添加代码(volatile int *)0xbfe10420 |=(216) 将这两个位设置为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文件,取消注释选项PAI2,添加宏Define选项SEL_CAN,如下图:
然后我们重新编译pmon源码烧录到开发板上,使用命令devmem0x1fe10420检查这两个引脚的复用是否已经成功设置为can,如下图:
将0x00131D49转换为二进制,可以发现第16到17位已经成功设置为1,因此这两个GPIO已经成功设置为CAN。然后我们就可以测试开发板的CAN功能了。
3.2.7 CAN接口测试
开发板配备2个CAN接口。我们可以利用这两个CAN接口来验证CAN数据的发送和接收。首先我们用电缆连接CAN1和CAN2(连接时可以: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接口设置对)。
对应视频教程:https://www.bilibili.com/video/BV1mT4y117eN?p=1