-
Notifications
You must be signed in to change notification settings - Fork 68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
为 rCore-Tutorial 提供 K210 支持 #80
Comments
在搞SBI实现了。设备树有点难搞,其它的好说。 |
经历了无数坑爹的事情,目前终于做到了:
|
在 Maixpy Go 上试验,学长写的 lab0 确实能在 k210 板子上跑了。能正确处理时钟中断并输出 |
我虽然是初学者, 没真正接触过嵌入式开发, 但也想学习如何移植rcore-tutorial到k210板子上. 搜集了一个下午的相关资料, 想分享一下, 希望能帮到水平相近的人. k210实现了 RV64IMAFDC (RV64GC)这些拓展, 达到G对应的general purpose的目标成为标准通用的指令集架构, 原本还有 S U表示支持supervisor模式和user模式, 但由于RISC-V的特权指令集的1.11版本在2019年8月份才正式作为发布定下来, k210实现的只是1.9.1版本这个草案, 造成了尴尬的局面. 因为有不少地方不兼容, 有些指令都不同. 许多地方直接把它当作不支持S和U并且没有分页能力的芯片来用, 如Linux方面在k210上的相关移植的实现就是运行在machine模式, nommu(不使用分页). 但是实际上K210还是支持Sv39分页模式和Supervisor模式的. RISC-V中通过misa寄存器表示实现了哪些拓展. K210的misa寄存器=0x800000000014112d, 这里面S对应的比特位确实是为1的. 如何检测分页模式的支持? 查找特权指令集的手册发现是, 当向satp寄存器的高位mod字段写入值的时候, 如果是不支持的分页模式, 整次写入无效, satp寄存器不改变. 相关的资料都很少, K210的datasheet中主要在说其他部分, 对CPU部分只有非常非常简单的介绍, 更没有提这些privilege的事情. 其他地方更是没有资料(因为我搜了很久都没有什么有价值的信息), 反而是我们rcore这边对这个芯片的CPU部分探索得更加深入. 其他许多地方都打算把k210作为不支持特权级的板子用. 甚至把device tree里cpu内的mmu-type字段设置为none. 相关链接:
来自: http://bxr.su/FreeBSD/sys/gnu/dts/riscv/kendryte/k210.dtsi 下面的链接是rcore-plus对k210支持相关的issue, 支持时稍微修改了opensbi. western digit的对linux machine mode nommu的ppt. 这里似乎是的k210的memory map |
关于这次移植的一点心得体会: 为何不直接用 M 态?
移植现状?
移植有何意义?
下一步计划
|
之前通过实现发现将 M 态外部中断代理到 S 态软中断进行处理是可行的,然而高速串口基于中断的输入有问题,总是会莫名其妙向后偏移 7 次输入。注意到能够找到的所有串口中断输入的程序都使用通用串口,猜测可能高速串口对于中断的处理有问题,试图将串口的使用从 K210 上的高速串口换成通用串口。 最近几天有一半时间都不能干活,简单将 K210 官方 SDK 中的相关代码直接放到 OpenSBI 中完成了串口替换,轮询输入仍没有问题,但是中断的时候读到的寄存器的值还是有问题。后来发现不能在输入中断处理过程中向串口中输出,会影响到相关状态寄存器的值。删掉相关代码之后终于能通过中断正确输入一个字符,然而后续中断无法触发,原因不明。而且整个项目已经被我搞的非常混乱,给调试带来很大困难。按照之前的计划,只能先放弃处理串口中断基于轮询进行输入。这个就等 tutorial 跑起来之后再考虑。 一些相关资源
进一步计划 之后先想办法把 buffered-uart 跑通看看能不能正常工作,如果可以的话基于它重新实现一套 SBI,否则就基于官方 SDK 实现 SBI。 |
搞完 lab2 之后重新整理了一下代码,发现高速串口中断在 M 态可以正常处理了! |
k210的core看起来是Rocket core |
之前基于教程第二版进行移植,截止到 lab1 可以在 K210 上运行。参考这里。
经过上周例会上的协商,应重点在第三版上进行移植工作。于是我将第三版 fork 了一份,在上面一边学习一边进行移植工作(我会将学习与移植的过程持续更新在这里)。思路仍是和之前一样基于 rjgg 魔改过的 OpenSBI 0.3。
目前,lab0 已经可以在 K210 上运行,代码可以在这里找到。值得一提的是,我对整个开发流程进行了封装,目前只需在
os
目录下make run-k210
即可一键完成构建、烧写以及进入终端与串口进行通信。有兴趣的同学可以帮我一起测试一下。令人惊喜的是,目前使用的命令行串口终端
cu
支持多颜色字体输出。但还不知道它对输入的支持怎么样:事实上我们在用户程序之前都不必考虑这一点。另外,@luojia65 正在用 Rust 自己实现一个 SBI,目前在 Qemu 上已经可以成功启动并在终端输出字符串。之后会考虑是否将现在使用 OpenSBI 换掉。
The text was updated successfully, but these errors were encountered: