VisionFive v1下移植xv6

感谢bss段清零后解决了很多奇怪的问题。


请问73号中断具体是什么中断,VisionFive V1下有哪些中断,中断号分别是什么?

UART 具体看手册或者 device tree

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/tree/arch/riscv/boot/dts/starfive/jh7100.dtsi#n321

感谢!

pinctrl部分:要按照那些对应的GPIOMUX的值和那些bias-disable/input-enable...之类的写到pinctrl@11910000的对应寄存器里面
clock部分:按照时钟树的关系设置对应的时钟,写clock-controller@11800000对应的寄存器
reset部分:写reset-controller@11840000对应的bit
interrupt部分:这个最简单,dts里面看是接到plic哪个irq就行了
这些信息都可以从dts里面找到,只不过你得自己来写寄存器。另外得自己写snps,dw-mshc驱动
感谢老师详细地指导, 这些硬件的文档哪里有,对应的寄存器怎么设置哪里能找到?

我能找到最好的是

官网的版本比这个还不全。但是这个也没有提到pinctrl/clock/reset 。可以看下linux的驱动,或者对照一下jh7110来做。jh7110的文档全很多,而且两者有很多重合的部分。

感谢指导

1、sd卡识别成功,关了中断,识别和读1扇区过程如下:

U-Boot SPL 2021.10-dirty (Dec 11 2024 - 19:18:09 +0800)
LPDDR4: 8G version: g8ad50857.
Trying to boot from SPI
K
xv6 kernel is booting.

boot from spi.
debug dwmci_init line 471
CMD_SEND:0 ARG:0x0000000000000000
MMC_RSP_NONE
CMD_SEND:8 ARG:0x00000000000001aa
MMC_RSP_R1,5,6,7  0x00000000000001aa
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000800120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0x0000000000ff8000
CMD_SEND:55 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000120
CMD_SEND:41 ARG:0x0000000040300000
MMC_RSP_R3,4 0xffffffffc0ff8000
sd_send_op_cond 55, 41 cmd completed.
CMD_SEND:2 ARG:0x0000000000000000
MMC_RSP_R2 0x0000000003534453
           0x0000000055303447
           0xffffffff8008db8f
           0xffffffffa900cc25

DUMPING DATA
0 - 0x0000000000000003 0x0000000000000053 0x0000000000000044 0x0000000000000053
4 - 0x0000000000000055 0x0000000000000030 0x0000000000000034 0x0000000000000047
8 - 0x0000000000000080 0x0000000000000008 0x00000000000000db 0x000000000000008f
12 - 0x00000000000000a9 0x0000000000000000 0x00000000000000cc 0x0000000000000025
CMD_SEND:3 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0xffffffffaaaa0520
CMD_SEND:9 ARG:0xffffffffaaaa0000
MMC_RSP_R2 0x00000000400e0032
           0x000000005b590000
           0x000000001d8a7f80
           0x000000000a4040b9

DUMPING DATA
0 - 0x0000000000000040 0x000000000000000e 0x0000000000000000 0x0000000000000032
4 - 0x000000000000005b 0x0000000000000059 0x0000000000000000 0x0000000000000000
8 - 0x000000000000001d 0x000000000000008a 0x000000000000007f 0x0000000000000080
12 - 0x000000000000000a 0x0000000000000040 0x0000000000000040 0x00000000000000b9
CMD_SEND:7 ARG:0xffffffffaaaa0000
MMC_RSP_R1,5,6,7  0x0000000000000700
CMD_SEND:55 ARG:0xffffffffaaaa0000
MMC_RSP_R1,5,6,7  0x0000000000000920
CMD_SEND:51 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000920
CMD_SEND:6 ARG:0x0000000000fffff1
MMC_RSP_R1,5,6,7  0x0000000000000900
CMD_SEND:55 ARG:0xffffffffaaaa0000
MMC_RSP_R1,5,6,7  0x0000000000000920
CMD_SEND:6 ARG:0x0000000000000002
MMC_RSP_R1,5,6,7  0x0000000000000920
CMD_SEND:6 ARG:0xffffffff80fffff1
MMC_RSP_R1,5,6,7  0x0000000000000900
CMD_SEND:55 ARG:0xffffffffaaaa0000
MMC_RSP_R1,5,6,7  0x0000000000000920
CMD_SEND:13 ARG:0x0000000000000000
MMC_RSP_R1,5,6,7  0x0000000000000920
sbss 0x000000004020c3f0, ebss 0x0000000040225ae0
hart 4 starting
hart 2 starting
fsinit sb.magic 0
hart 3 starting
mmc_bread nunmber of blocks 7744512
CMD_SEND:16 ARG:0x0000000000000200
MMC_RSP_R1,5,6,7  0x0000000000000900
CMD_SEND:18 ARG:0x0000000000000002
dwmci_data_transfer DATA ERROR! mask 0x424  0xbe80
RET -22
fsinit sb.magic 0

2、sd卡上内容为:dd if=fs.img of=/dev/sdb1 seek=1 bs=1024, fs.img是文件系统的镜像,0扇区为boot扇区不在fs.img里,从1扇区开始为superblock,因此dd时跳过0扇区,直接写入sd卡的1扇区。
3、源码放在:github.com:ahczgy/xv6vf1.git,名字仍然是xv6vf1,其实已修改移植到vf2下。
现在问题就是读1扇区不成功,请路过的多指教,感谢。

已解决。
1、读sd卡失败问题。

采用FIFO模式读,传入存放读取数据的内存需要在16、32或64字节上对齐。8字节上对齐会发生如下错误
1735568581087
DMA对齐也未读成功,有待以后尝试。对齐办法:
1735568975145
2、如何正确地将fs.img文件写到sd卡上。一是将待写的sd卡用分区工具DiskGenius删除所有分区。二是在linux下用dd命令写入,命令如下:dd if=fs.img of=/dev/sdb bs=1024,注意是/dev/sdb,不带数据1或2之类意味着是未分区的sd卡。
注意:xv6的mkfs工具是将superblock写在第1个block里,这里1个block是1024字节,而sd卡的1个block是512字节。

1 Like

召唤楼主回来更新。什么时候移植到vf2上 :rofl:

早就移植到VF2上了,你就没在论坛里搜搜?或者点击楼主的信息,看看他还有啥文章?

已移植到vf2,惭愧,一直没有解决二次加载sd卡上fs.img文件出错问题,大概原因是vf2直接按重启键重启,导致sd卡上文件系统不一致,按说这个文件系统有log会回滚一致的,看了很多次也没看明白,抱歉!

将uart.c中输出’\n’字符的地方,先输出个’\r’即可。

1 Like

不需要这么麻烦直接:dd if=fs.img of=/dev/sdb bs=512即可

最新进展,已可以热启动,SD卡驱动稳定,采用polling方式,中断方式未实现。现在正在尝试网卡驱动:6 kernel is booting.

memory layout
Section Start End Size


text 0x0000000040200000 0x000000004020a000 40 KB
rodata 0x000000004020a000 0x000000004020b3b9 4 KB
data 0x000000004020b3c0 0x000000004020b3e8 0 KB
bss 0x000000004020b3f0 0x00000000402354a0 168 KB
stack0 0x000000004020b590 0x0000000040214590 36 KB

end 0x00000000402354a0
Total 249 KB

plic: 7 interrupts enabled
IRQ Device


32 uart0
38 spi0
50 unknown-50
74 sdio1
86 gpio
98 unknown-98
7 gmac0
sdmmc: Initializing SD card…
sdmmc: controller version=0x5342290a
sdmmc: Switched to POLLING mode
sdmmc: CMD0
sdmmc: CMD8
sdmmc: ACMD41
sdmmc: Card ready!
sdmmc: CMD2
sdmmc: CMD3
sdmmc: CMD9
sdmmc: CMD7
sdmmc: CMD16
sdmmc: Manufacturer: SanDisk (0x02)
sdmmc: Product: T23X
sdmmc: OEM ID: 0x8803
sdmmc: Capacity: 970 MB (Standard SD)
sdmmc: SD init complete
sdmmc: SD card ready!
net: initializing Ethernet…
yt8531: addr 0: ID1=0x0000, ID2=0x0000
yt8531: addr 1: ID1=0x0000, ID2=0x0000
yt8531: addr 2: ID1=0x0000, ID2=0x0000
yt8531: addr 3: ID1=0x0000, ID2=0x0000
yt8531: addr 4: ID1=0x0000, ID2=0x0000
yt8531: addr 5: ID1=0x0000, ID2=0x0000
yt8531: addr 6: ID1=0x0000, ID2=0x0000
yt8531: addr 7: ID1=0x0000, ID2=0x0000
yt8531: addr 8: ID1=0x0000, ID2=0x0000
yt8531: addr 9: ID1=0x0000, ID2=0x0000
yt8531: addr 10: ID1=0x0000, ID2=0x0000
yt8531: addr 11: ID1=0x0000, ID2=0x0000
yt8531: addr 12: ID1=0x0000, ID2=0x0000
yt8531: addr 13: ID1=0x0000, ID2=0x0000
yt8531: addr 14: ID1=0x0000, ID2=0x0000
yt8531: addr 15: ID1=0x0000, ID2=0x0000
yt8531: addr 16: ID1=0x0000, ID2=0x0000
yt8531: addr 17: ID1=0x0000, ID2=0x0000
yt8531: addr 18: ID1=0x0000, ID2=0x0000
yt8531: addr 19: ID1=0x0000, ID2=0x0000
yt8531: addr 20: ID1=0x0000, ID2=0x0000
yt8531: addr 21: ID1=0x0000, ID2=0x0000
yt8531: addr 22: ID1=0x0000, ID2=0x0000
yt8531: addr 23: ID1=0x0000, ID2=0x0000
yt8531: addr 24: ID1=0x0000, ID2=0x0000
yt8531: addr 25: ID1=0x0000, ID2=0x0000
yt8531: addr 26: ID1=0x0000, ID2=0x0000
yt8531: addr 27: ID1=0x0000, ID2=0x0000
yt8531: addr 28: ID1=0x0000, ID2=0x0000
yt8531: addr 29: ID1=0x0000, ID2=0x0000
yt8531: addr 30: ID1=0x0000, ID2=0x0000
yt8531: addr 31: ID1=0x0000, ID2=0x0000
net: no YT8531 PHY found
net: initialization failed
hart 2 starting
hart 4 starting
hart 3 starting
init: starting sh
$

网卡驱动不易解决,欢迎支招。

运行环境说明:1、xv6运行在starfive2(v1.3B),64位开发板上;
2、xv6被恢复软件jh7110-recovery-20221205.bin刷到原本visionfive2_fw_payload.img所在的flash里(具体地址是?)
3、SPL->xv6,flash里的xv6被u-boot的SPL直接加载到内存0x40200000处运行,跳过open-sbi和u-boot.所以板子只有SPL进行的一些初始化。