一樣開頭先上成果~
完整影片可見:
https://twitter.com/Ruinland_Mask/status/1445487285529501707
之前的問題在於,LiteX-UART的chardev沒有出現在新的rootfs的dev底下,kernel自己可以存取liteuart沒差,但是getty要存取,那對應的chardev就要存在。
然而...... LiteX-UART的major跟minor都是0
:
static struct uart_driver liteuart_driver = {
.owner = THIS_MODULE,
.driver_name = "liteuart",
.dev_name = "ttyLXU",
.major = 0,
.minor = 0,
.nr = CONFIG_SERIAL_LITEUART_MAX_PORTS,
#ifdef CONFIG_SERIAL_LITEUART_CONSOLE
.cons = &liteuart_console,
#endif
};
簡單說這不是想讓你自己去mknod出來的東西。
解法有很多,改code是種方式,但是,RISC-V Linux有招祖傳甕底小東西 — — SBI。
在過去,因為RISC-V CPU的開發都在FPGA或模擬器上,一些peripheral可能都還在半殘狀態,所以SBI層的legacy版本留著console的getchar跟putchar SBI call、可以讓程式有個簡單暴力的文字界面可以互動;而Linux原本在過去Xen虛擬機時代時,留有HVC (Hypervisor Virtual Console)的界面。兩者一拍即合,叫做RISCV_SBI_HVC。
在懶得改code下,火速修了一下 Alpine Init的邏輯,叫它不要去折騰其他tty,就大功告成了,不會再狂噴找不到 /dev/liteuart
給getty去attach。