MQ工程开源地址: https://github.com/mangopi-sbc/MQ
ARM芯片和RV芯片完全pin2pin,但因DDR不同,T113的DRAM供电1.5V,而D1s(F133)则是1.8V.
涉及到麻雀上只需改动R10(300K)为220K即可。
最近编辑记录 mango (2022-02-13 11:19:15)
歪朵拉开源硬件: https://widora.cn
淘宝: https://widora.taobao.com/
离线
同一颗die,只是T113开核了ARM。
歪朵拉开源硬件: https://widora.cn
淘宝: https://widora.taobao.com/
离线
有详细资料吗?特别是编译环境之类的
离线
插眼关注。。。
离线
现在有个棘手的问题,fel模式下如果通过代码的方式区分这些马甲,已知有两类,RISCV单核一类,ARM双核一类。
RISCV 单核,D1/F133,检测代码
static int chip_detect(struct xfel_ctx_t * ctx, uint32_t id)
{
if(id == 0x00185900)
{
/*
* XuanTie C906 RISC-V
*/
if(R32(0x00000000) == 0x43014281)
return 1;
}
return 0;
}
ARM双核,R528/T113,检测代码
static int chip_detect(struct xfel_ctx_t * ctx, uint32_t id)
{
if(id == 0x00185900)
{
/*
* Dual-Core ARM Cortex-A7
*/
if(R32(0x00000000) == 0xea000019)
return 1;
}
return 0;
}
这里通过读取0地址的机器码来判断是开启的是RISCV还是ARM核,但如何进一步区分,这马甲是R528还是T113呢?或者更近一步,能区分出马甲的尾缀,比如R528-S2,R528-S3,T113-S2,T113-S3这些马甲呢?
有没有相关解决这个问题的思路呢,大家来点脑洞吧,也许真能找到完美解决方案。
离线
这是坑网网友mengxp逆向R328-S3 fes1 工程里的相关代码,有一个bond_id_check函数,这个看名字是芯片邦定相关检测函数,感觉没啥大用,理论上全志应该会有一套自己的马甲管理方案的,也便于自己做产品控制,相关信息也一定会在封装时写入了efuse之类的地方,包括开哪个核,等等,这些细节有可能研究出来吗?
uint32_t crc_16(uint16_t reg, uint8_t data_crc)
{
uint32_t ret;
uint16_t v3;
uint16_t v4;
ret = reg ^ (data_crc << 8);
v3 = 8;
do {
v4 = 2 * ret;
v3--;
if ((ret << 16) >= 0)
ret = v4;
else
ret = v4 ^ 0x8005;
} while (v3);
return ret;
}
uint32_t disturb_coding(uint16_t disturb_code, uint8_t id_num)
{
return (disturb_code + id_num) | (crc_16(disturb_code, id_num) << 16);
}
uint32_t id_judge_fun(uint16_t disturb_code)
{
uint32_t chipId;
uint8_t v5;
uint32_t ret;
chipId = MEMORY(0x3006200) & 0xF;
printf("the chip id is 0x%x\n", chipId);
if (chipId == 3)
{
v5 = 7;
ret = disturb_coding(disturb_code, v5);
}
else
{
v5 = 1;
ret = 0;
}
return ret;
}
int bond_id_check(void)
{
uint8_t v0;
uint32_t v1;
uint16_t v3;
uint32_t v4;
v0 = 1;
v1 = id_judge_fun(0);
while (v1 != disturb_coding(0, v0))
{
v0++;
if (v0 == 17)
return 0;
}
v3 = 1;
while (1)
{
v4 = id_judge_fun(v3);
if (v4 != disturb_coding(v3, v0))
break;
v3++;
if (v3 == 5)
return 1;
}
return 0;
}
int chip_id_check(void)
{
uint32_t chipId = MEMORY(0x3006200) & 0xF;
if(chipId != 3)
return 0;
return 1;
}
离线
这个是说芯片内实际上包含了 2个 ARM A7 和 1个 RISC-V? 只是在封装时只引出了其中一个?
这个成本老高了!
有没办法我自己去改变配置,想用哪个用哪个?
离线
是4核的die,还有个dsp,之前分析r528的时候就dump了riscv的brom 跟d1的一模一样。
离线
感觉未来很有可能会出一个4核版的异构马甲,该赚的钱都得赚到,才能不辱使命
离线
V1.2.5版本支持R528-S3和T113-S3 DDR 初始化命令
xfel ddr r528-s3
xfel ddr t113-s3
离线
现有的F133能在arm和RISCV之间切换就无敌了
离线
离线
这个啥价格啊 芯片啥价格呢?
离线
车规的芯片,比F133贵不了几块
歪朵拉开源硬件: https://widora.cn
淘宝: https://widora.taobao.com/
离线
啥时候开卖
离线
坐等开卖
离线
这个相当期待. 欢迎LZ一有消息就来更新.
另外,希望软件配套上尽量完善些, 这样开发板用起来要容易些
离线
我的麻雀F133还在吃灰呢
最近编辑记录 xiongxinjian (2022-02-16 12:40:34)
离线
XBOOT第一时间支持T113-S3,xfel也顺利支持T113-S3,但现在ARM的中断没办法响应,估计被RISCV劫持了,或者其他什么情况,应该需要设置某些寄存器。这个问题留给有心人研究了。包括如何启动另外一个ARM核,这个是双核CORTEX-A7
下面是写demo
离线
全志T113-S3编译烧写步骤
https://xboot.org/xboot/#/guide-allwinner-t113s3
编译源码,生成的目标文件在output目录下
make clean
make CROSS_COMPILE=/path/to/arm-none-linux-gnueabihf- PLATFORM=arm32-t113s3
烧写到RAM中并运行
sudo xfel ddr t113-s3; sudo xfel write 0x40000000 xboot.bin; sudo xfel exec 0x40000000;
烧写普通镜像到SPI Nor Flash
sudo xfel spinor write 0 xboot.bin
烧写压缩镜像到SPI Nor Flash
sudo xfel spinor write 0 xboot.bin.z
烧写普通镜像到SPI Nand Flash
sudo xfel spinand splwrite 2048 1048576 xboot.bin
烧写压缩镜像到SPI Nand Flash
sudo xfel spinand splwrite 2048 1048576 xboot.bin.z
现在T113还没有实现get_boot_device函数,默认引导介质为SPI NOR FLASH,F133, D1这些已实现get_boot_device函数。
离线
@xboot
这个CPU之前恰巧分析过一些,当时为了删除TEE做了第二核启动的linux逻辑。
实际上启动第二核心很简单,就两个东西。中断我没看到有什么被劫持的地方,
也可能是我没找到吧。而且T113的BROM就是确实也是ARM代码开始的,听代理
说这两个die是存在差异的,所以我也不确定是不是还有RSICV的核心在里面。
一个是brom代码dump一下就能看到的入口地址,就在开头位置。
第二就是打开手册里面提到的C0_RST_CTRL,将核心1打开。
cpuboot_membase = 0x070005c4
cpuxcfg_membase = 0x09010000
参考代码如下
writel(__pa_symbol(secondary_startup), cpuboot_membase + cpu*4);
/* Deassert the CPU core in reset */
reg = readl(cpuxcfg_membase);
writel(reg | BIT(cpu), cpuxcfg_membase)
离线
RSICV核心在里面的,因为我可以dump T113的RISCV的brom,跟D1/F133的RISCV做了比较,一模一样。
离线
这么神奇的啊,话说RISCV的BROM在那个位置弄出来的啊
离线
RSICV核心在里面的,因为我可以dump T113的RISCV的brom,跟D1/F133的RISCV做了比较,一模一样。
那是用熔丝位做区分的?
离线
这么神奇的啊,话说RISCV的BROM在那个位置弄出来的啊
同求如何读brom固件方法。
离线
用xfel工具,很容易读取BROM
https://whycan.com/t_6546.html#p72836
离线
xfel read 0x00000000 0x10000 t113-arm-brom.bin
xfel read 0x06000000 0x10000 t113-riscv-brom.bin
离线
强,啥时候又来了这玩意,价格多少呢,F133还没用起来不会就换了吧?铁打的人,流水的芯片方案
离线
t113主频多少?月底应该能买到样品了
离线
看手册说的是800MHZ,但我跑的1.008GHZ
离线
T113跟R528完全一样的,都是开启的arm双核,两者仅封装不一样,R528是BGA封装的,T113跟R528相比,少引出了一些gpio,见下表。
离线
看手册说的是800MHZ,但我跑的1.008GHZ
大概主频是1.2G
RISC-V内核与A7内核是二选一,不能同时使用(功耗扛不住?)
HIFI4 DSP理论上可以拿来跑异构应用,但是暂无多少详细的开发资料,理论上就是Cadence Xplorer那个IDE,需要原厂提供sdk,DSP的jtag信号也印出来了,应该可以跑起来
离线
@xboot
感谢你的工具,我们已经用上了:P
离线
哪吒麻雀rv版有spi Nor Flash吗?
离线
哪吒麻雀rv版有spi Nor Flash吗?
没,可自行焊接nor或nand
歪朵拉开源硬件: https://widora.cn
淘宝: https://widora.taobao.com/
离线
@shaoxi2010 谢谢大佬!SMP启动成功
/*
The Soft Entry Address Register of CPU0 is 0x070005C4.
The Soft Entry Address Register of CPU1 is 0x070005C8.
*/
void rt_hw_secondary_cpu_up(void)
{
uint32_t cpuboot_membase = 0x070005c4;
uint32_t cpuxcfg_membase = 0x09010000;
uint32_t reg;
/* Set CPU boot address */
writel((uint32_t)(secondary_cpu_start), cpuboot_membase + 1 * 4);
/* Deassert the CPU core in reset */
reg = readl(cpuxcfg_membase);
writel(reg | (1 << 1), cpuxcfg_membase);
reg = readl(cpuxcfg_membase);
__asm__ volatile ("isb":::"memory");
}
\ | /
- RT - Thread Operating System
/ | \ 4.1.0 build Apr 9 2022 21:17:55
2006 - 2022 Copyright by RT-Thread team
[I/sal.skt] Socket Abstraction Layer initialize success.
cpuxcfg_membase = 0x13FF0101 // 启动之前的值
cpuxcfg_membase = 0x13FF0103 // 启动之后的值
Hello T113 RT-Thread SMP!
msh />ps
thread cpu bind pri status sp stack size max used left tick error
-------- --- ---- --- ------- ---------- ---------- ------ ---------- ---
tshell 0 2 20 running 0x00000140 0x00001000 15% 0x0000000a 000
aio N/A 2 16 suspend 0x00000080 0x00000800 07% 0x0000000a 000
sys work N/A 2 23 suspend 0x00000084 0x00000800 06% 0x0000000a 000
tsystem N/A 2 30 suspend 0x00000098 0x00000400 22% 0x00000020 000
tidle1 1 1 31 running 0x0000005c 0x00000400 19% 0x00000020 000
tidle0 N/A 0 31 ready 0x0000005c 0x00000400 19% 0x00000020 000
timer N/A 2 4 suspend 0x0000007c 0x00000400 12% 0x0000000a 000
最近编辑记录 aozima (2022-04-09 21:45:35)
离线
@aozima
请问哪里可以找到t113用的rtthread,可以分享一下吗
离线
中断要对Gic初始化,每个cpu interface 要单独初始化。现在双核全开,每个核心处理不同中断。
离线
F133 T113弄得很详细的,2颗都有批量出货了
离线
@aozima 你好,这个RTThread 环境怎么搭建,有无文章
离线
时隔一年,一个偶然的发现,搞定了T113的中断, _vector 需要32字节对齐,补丁如下:
diff --git a/src/arch/arm32/mach-t113s3/start.S b/src/arch/arm32/mach-t113s3/start.S
index 39d83e78a..4415adea1 100644
--- a/src/arch/arm32/mach-t113s3/start.S
+++ b/src/arch/arm32/mach-t113s3/start.S
@@ -86,7 +86,7 @@
.global _start
_start:
/* Boot head information for BROM */
- .long 0xea000016
+ .long 0xea00000e
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0x12345678 /* checksum */
.long __spl_size /* spl size */
@@ -97,7 +97,9 @@ _start:
.long 0x0 /* eGON version */
.byte 0x00, 0x00, 0x00, 0x00 /* platform information - 8byte */
.byte 0x34, 0x2e, 0x30, 0x00
+ .long 0, 0, 0, 0 /* reserve */
+ .align 5
_vector:
b reset
ldr pc, _undefined_instruction
离线