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.binxfel 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离线