F1C100s,如何能从正常运行状态切换到FEL模式?
跑的xboot,在已经运行起来了的状态下,调用start.S里的return_to_fel,没用。程序进入了不正常的状态。
离线
从这里 http://sunxi.org/FEL 的信息来看,似乎跳转到0xFFFF0020执行就是进FEL模式了,简单得难以置信。明天到公司试试。
离线
我也想找正常spi启动然后退回fel的方法。直接跳转到0xffff0020貌似不行,而且eGon也加回去了。楼主解决了的话分享一下
离线
阶段性成果:目前能够在正常运行状态切换到FEL了,可以读写内存什么的。但是还无法通过sunxi-fel操作SPI Flash。
// xboot代码里把IRQ MASK全置1了,至少需要把USB-OTG(bit 26)置0才能进FEL。
write32(0x01C20400 + 0x30, 0);
// Control Register bit 13,使用高地址向量表
arm32_write_p15_c1(arm32_read_p15_c1() | (1 << 13));
// 跳转到FEL
asm("BX %0" : : "r"(0xFFFF0020));
最近编辑记录 Quotation (2019-01-19 16:04:54)
离线
阶段性成果:目前能够在正常运行状态切换到FEL了,可以读写内存什么的。但是还无法通过sunxi-fel操作SPI Flash。
// xboot代码里把IRQ MASK全置1了,至少需要把USB-OTG(bit 26)置0才能进FEL。 write32(0x01C20400 + 0x30, 0); // Control Register bit 13,使用高地址向量表 arm32_write_p15_c1(arm32_read_p15_c1() | (1 << 13)); // 跳转到FEL asm("BX %0" : : "r"(0xFFFF0020));
就是说USB可以识别FEL设备,但是不能操作flash?
是不是spi外设时钟等没有配置好?
离线
就是说USB可以识别FEL设备,但是不能操作flash?
是不是spi外设时钟等没有配置好?
是,sunxi-fel writel/readl等命令都可以用,flash相关的命令不可用。
猜测是某些寄存器需要重置为初始状态,FEL不会做太多检查、初始化的动作。如果代码里已经初始化了SPI,可能需要恢复原状。
离线
basicdev 说:就是说USB可以识别FEL设备,但是不能操作flash?
是不是spi外设时钟等没有配置好?是,sunxi-fel writel/readl等命令都可以用,flash相关的命令不可用。
猜测是某些寄存器需要重置为初始状态,FEL不会做太多检查、初始化的动作。如果代码里已经初始化了SPI,可能需要恢复原状。
那继续加油,我在这里围观。
离线
可以的 sunxi.org 网站有专门一个TF卡固件,插入TF卡,强制进入FEL
简单找了下没找到,可以发个定位不?
不过我自己改了个,也可以用 https://whycan.com/t_6768.html
离线
val = readl(CCU_BASE + SUNIV_BUS_SOFT_RST_REG0);
val &= ~(1 << 20);
writel(CCU_BASE + SUNIV_BUS_SOFT_RST_REG0, val);
val |= 1 << 20;
writel(CCU_BASE + SUNIV_BUS_SOFT_RST_REG0, val);
其实再加一步, 重启一下spi就好了
离线
不行诶,早就试过reset SPI、还有恢复SPI相关的一些寄存器,没成功。
离线
我写的裸机程序是可以在从sd卡和norflash返回时正常使用spi烧录的,可能是xboot开了cache和mmu的原因吧
离线
我补充一个F133 / D1s的方式吧,这个是利用rtc寄存器在reset时能够保持的特性开发的,原理比较简单,就是设置rtc寄存器为某个特殊的值后直接重启,start.s会检查rtc寄存器,如果为某个特殊值,就直接进入fel模式。
相关代码:
/*
* command/cmd-fel.c
*/
#include <xboot.h>
#include <command/command.h>
static void usage(void)
{
printf("usage:\r\n");
printf(" fel\r\n");
}
static int do_fel(int argc, char ** argv)
{
virtual_addr_t virt = phys_to_virt(0x07090000);
do {
write32(virt + 0x100 + 0x8, 0x5aa5a55a);
mb();
smp_mb();
} while(read32(virt + 0x100 + 0x8) != 0x5aa5a55a);
machine_reboot();
return 0;
}
static struct command_t cmd_fel = {
.name = "fel",
.desc = "reboot and enter to fel mode",
.usage = usage,
.exec = do_fel,
};
static __init void fel_cmd_init(void)
{
register_command(&cmd_fel);
}
static __exit void fel_cmd_exit(void)
{
unregister_command(&cmd_fel);
}
command_initcall(fel_cmd_init);
command_exitcall(fel_cmd_exit);
/* Check flag and enter to fel mode */
addi sp, sp, -32
sd s0, 8(sp)
sd s1, 16(sp)
sd ra, 24(sp)
mv s0, a0
li t0, 0x07090108
lw t1, (t0)
li t2, 0x5aa5a55a
sw zero, (t0)
bne t1, t2, _fel
ld ra, 24(sp)
ld s0, 8(sp)
ld s1, 16(sp)
addi sp, sp, 32
ret
_fel:
nop
权当抛砖引玉
最近编辑记录 xboot (2021-11-02 17:24:38)
离线
阶段性成果:目前能够在正常运行状态切换到FEL了,可以读写内存什么的。但是还无法通过sunxi-fel操作SPI Flash。
sunxi-fel不正常,可以试一试xfel,xfel在操作spi flash时会做很多初始化工作,xfel相比sunxi-fel,做的工作更多,依赖条件也更少。
离线
xboot说的有道理,可以试试
离线
这个功能没有继续研究出来有点可惜了. 要是可以在运行以后再进入FEL模式还是方便的
离线
T113-S测试在UBOOT模式下使用mw 命令修改RTC寄存器可以
=> md.l 0x07090108 1
07090108: 00000000 ....
=> mw.l 0x07090108 0x5aa5a55a 1
=> md.l 0x07090108 1
07090108: 5aa5a55a Z..Z
=> reset
最近编辑记录 VAN-D (2024-10-24 09:23:07)
离线
在Linux下也可以使用sunxi_dump 模块操作寄存器
echo 0x07090108 0x5aa5a55a > /sys/class/sunxi_dump/write
cat /sys/class/sunxi_dump/write
离线