全志D1开发(二)添加串口驱动

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2022年5月1日19:03:47 评论 1,019

1. 基础功能修改

1.1 创建base,导入BSP工程

根据全志D1的架构说明,创建base时选择如下:

全志D1开发(二)添加串口驱动

创建完成后base中的libsylixos版本比较低,内核中的riscv架构是不支持全志D1使用的c906核的,所以需要到以下git地址下载最新的libsylixos将IDE创建出来的libsylixos给他替换掉:

http://git.sylixos.com/repo/libsylixos.git

替换编译好base工程后,下载并导入BSP空模板工程工后续修改。

1.2 startup.S

启动文件中的内容很简单,跟arm架构的比较类似,主要就是设置异常向量表、初始化内核数据段啥的,具体如下:

  • 首先关中断然后跳转到reset入口
  • 接着设置中断入口为archTrapEntry,然后清零所有cpu寄存器
  • 初始化栈地址,拷贝内核数据段,清零内核bss段
  • 设置好栈,跳转c语言实现的接口执行

具体的代码大家可以亲自去瞅瞅,不算太难,都是一些基础性的工作。

1.3 SylixOS/config.h

接下来需要对SylixOS要求的内存段进行配置,由于riscv架构需要有SBI代码常驻内存,所以我们还不能将OpenSBI所在的内存给覆盖掉,查看启动打印输出可以看到OpenSBI在内存最开始的地方,如下所示:

全志D1开发(二)添加串口驱动

所以在内存的划分上,我们要将内存前面预留一段空间,这里我们选择预留32MB,也就是SylixOS内核的基址是从0x40000000+32MB=0x42000000开始的,如下所示:

全志D1开发(二)添加串口驱动

1.4 bspMap.h

物理地址映射表后续添加驱动时我们需要将外设寄存器的地址填入这个表中,以便系统在启动的时候就能映射,我们这修改app和ioremap所使用的虚拟地址空间,只要不和物理映射表中的地址冲突就行,如下所示。

全志D1开发(二)添加串口驱动

1.5 bspLib.c

修改BSP板级包的字符串信息,用于在启动时打印使用,如下所示。

全志D1开发(二)添加串口驱动

1.6 bspInit.c

这里主要是修改fpu、mmu、cache初始化时要传入的参数,这里要注意的是由于riscv架构没有具体定义cache刷新、失效之类的指令,所以全志D1采用的c906核自己扩展了这些指令,想要使用这些指令就需要使用c906自己的编译工具链,SylixOS编译工具链在riscv下目前不支持这些自定义指令,所以内核中对cache刷新、失效之类的都是空实现,这点需要特别注意。

对fpu的初始化如下:

全志D1开发(二)添加串口驱动

对mmu的初始化如下:

全志D1开发(二)添加串口驱动

对cache的初始化如下:

全志D1开发(二)添加串口驱动

其实c906的cache硬件上固定使用write back机制,这里的设置参数到底层最终都是无操作实现。

2. 添加串口驱动

2.1 实现调试打印接口

全志D1的uart和全志R16的uart模块是一样的,只需要将寄存器基址和中断号修改即可。首先将全志R16的串口驱动复制到driver目录下:

全志D1开发(二)添加串口驱动

开发板使用的是uart0,通过查阅手册修改uart.c中定义的寄存器基址:

全志D1开发(二)添加串口驱动

串口的输入需要使用中断机制,中断号的修改我们留到后续中断控制器驱动完成后再弄。要想在mmu开启之后访问寄存器,我们需要将串口寄存器的地址填入bspMap.h中映射,如下所示。

全志D1开发(二)添加串口驱动

调试需要实现bspLib.c中的调试打印输出接口,这个在串口驱动中已经有对应的接口,直接填入即可,如下所示(别忘了在文件开始包含uart.h头文件)。

全志D1开发(二)添加串口驱动

最后需要将内核启动参数中的kdlog改为yes,以便内核输出调试日志,从而来判断串口输出功能是否正常,由于目前在调试阶段,我们可以先将文件挂在内存上,如下所示:

全志D1开发(二)添加串口驱动

2.2 网络引导系统

2.2.1 IDE tftp设置

上述文件修改完成之后,直接编译IDE会自动扫描工程并填写makefile中的内容,编译完成后生成bspallwinnerd1.bin,这个就是我们要使用的镜像文件,后面我们主要通过网络来下载此镜像并引导系统。想要uboot使用tftp下载文件就需要在电脑上运行一个tftp server,这里我们使用IDE中自带的tftp server功能。通过点击tools->tftp server来打开tftp server设置,如下所示:

全志D1开发(二)添加串口驱动

打开设置对话框后,需要选择bspallwinnerd1.bin所在的目录,点击output选择bspallwinnerd1/Output目录,然后点击ok,如下所示。

全志D1开发(二)添加串口驱动

随后点击Save和Start按钮来启动tftp server,这样电脑端的设置就完成了,后续就可以在uboot下通过tftp命令下载allwinnerd1.bin文件到内存中了。

2.2.2 uboot tftp引导SylixOS镜像

引导命令大致分为三段:

  • 由于buildroot编译出来的uboot跳转到系统代码之前会打开看门狗,所以我们需要在命令行先关闭看门狗功能,命令如下:
wdt dev watchdog@6011000;wdt stop;
  • 接下来需要设置开发板的ip地址和tftp服务端的ip地址,我自己的电脑ip地址为10.9.0.107,开发板地址设置为10.9.0.109,大家根据实际情况修改设置,如下所示:
setenv ipaddr 10.9.0.109;setenv serverip 10.9.0.107;
  • 最后我们需要通过tftp命令将bspallwinnerd1.bin下载到0x42000000内存地址处,然后通过go命令跳转到SylixOS内核中执行,如下所示:
tftp 42000000 bspallwinnerd1.bin;go 0x42000000

由于本次buildroot编译出的uboot无法保存环境变量,每次重启时都需要设置上述命令,可以将命令保存在文本文件里以便复制:

wdt dev watchdog@6011000;wdt stop;setenv ipaddr 10.9.0.109;setenv serverip 10.9.0.107;tftp 42000000 bspallwinnerd1.bin;go 0x42000000

一切正常后便可以看到串口上输出了内核打印的日志信息,如下所示。

全志D1开发(二)添加串口驱动

我们也可以通过bootm命令来引导SylixOS内核,将引导命令修改为如下:

wdt dev watchdog@6011000;wdt stop;setenv ipaddr 10.9.0.109;setenv serverip 10.9.0.107;tftp 42000000 uImage;bootm 0x42000000

通过tftp下载的是uImage镜像而不是bin文件镜像,最后通过bootm命令引导启动SylixOS,如下所示:

全志D1开发(二)添加串口驱动

2.3 创建串口tty设备,启动系统

跟全志R16一样,sio创建驱动代码都是一样的,直接将接口放到bspInit.c中的halDevInit中调用并创建tty设备,如下所示。

全志D1开发(二)添加串口驱动

同样需要在文件开始处包含uart.h头文件,后续添加新驱动时都需要按个添加驱动的头文件,这点在后面不会再提醒,一定要牢记。最后别忘了将halBootThread中的启动脚本执行代码给注释掉,不然是无法启动到系统logo的,如下所示:

全志D1开发(二)添加串口驱动

都完成后重新编译内核镜像,重启开发板引导,如果没问题的话就会看到SylixOS系统logo了:

全志D1开发(二)添加串口驱动

gewenbin
  • 本文由 发表于 2022年5月1日19:03:47
  • 转载请务必保留本文链接:http://www.databusworld.cn/10629.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: