页次: 1
@tangloong
用大佬xboot做的xfel可以识别nand的 https://whycan.com/t_7323.html
@tangloong
兄弟 我把板子换成了nor flash,用https://whycan.com/t_4907.html里大佬们的方法烧录启动成功了。
Nand我用xfel把spl烧录进去是可以启动的,但是nand容易有坏块,所以它是通过烧录到多个page,启动时会依次从0,32,64....寻找启动固件,而且BOOTROM是只从page中取1K的数据,用xfel spinand splwrite 1024 <address> <file> - Write file to spi nand flash with split support来烧录,参考https://whycan.com/t_4916.html。spl启动后我没有尝试了,后面的程序启动需要nand驱动和校验的支持,一般的应用程序又不大,没必要上nand。
附上我改的通过uart1打印调试信息的spl
boot.zip
#include <io.h>
void sys_uart_putc(char c)
{
uint32_t addr = 0x01c25400;
while((read32(addr + 0x7c) & (0x1 << 1)) == 0);
write32(addr + 0x00, c);
}
void sys_uart_init(void)
{
uint32_t addr;
uint32_t val;
/* Config GPIOA3 and GPIOA2 to txd1 and rxd1 */
addr = 0x01c20800 + 0x00;
val = read32(addr);
val &= ~(0xf << ((3 & 0x7) << 2));
val |= ((0x5 & 0x7) << ((3 & 0x7) << 2));
write32(addr, val);
val = read32(addr);
val &= ~(0xf << ((2 & 0x7) << 2));
val |= ((0x5 & 0x7) << ((2 & 0x7) << 2));
write32(addr, val);
/* Open the clock gate for uart1 */
addr = 0x01c20068;
val = read32(addr);
val |= 1 << 21;
write32(addr, val);
/* Deassert uart1 reset */
addr = 0x01c202d0;
val = read32(addr);
val |= 1 << 21;
write32(addr, val);
/* Config uart1 to 115200-8-1-0 */
addr = 0x01c25400;
write32(addr + 0x04, 0x0);
write32(addr + 0x08, 0xf7);
write32(addr + 0x10, 0x0);
val = read32(addr + 0x0c);
val |= (1 << 7);
write32(addr + 0x0c, val);
val = 54;
write32(addr + 0x00, val & 0xff);
write32(addr + 0x04, (val >> 8) & 0xff);
val = read32(addr + 0x0c);
val &= ~(1 << 7);
write32(addr + 0x0c, val);
val = read32(addr + 0x0c);
val &= ~0x1f;
val |= (0x3 << 0) | (0 << 2) | (0x0 << 3);
write32(addr + 0x0c, val);
sys_uart_putc('I');
sys_uart_putc('n');
sys_uart_putc('i');
sys_uart_putc('t');
sys_uart_putc(' ');
sys_uart_putc('O');
sys_uart_putc('K');
sys_uart_putc('\r');
sys_uart_putc('\n');
}
页次: 1