本人喜欢折腾
本贴给喜欢裸机开发的人,提供一个思路。
不欢迎上来就讨论裸机无用、裸机麻烦、嘲笑只会用现成IDE不研究GCC和系统的人,请绕行。
本人也是初次用这些,程序难免存在一些问题和不懂的地方,欢迎一块讨论。
一、IAR工程下的bootloader
iar_bootloader\project\bootloader\iar目录下面有IAR工程。可以用jlink仿真,可以烧写到spinor(W25Q256)。
1.此bootloader是将awboot移植(抄袭)到了IAR下面,做了魔改,用来支持spinor flash(因为手里只有spinor flash),启动裸机程序。
2.这个bootloader含有t113-s3芯片的加载头,会初始化led,uart,clk,ddr,spi等外设。芯片上电从spi flash启动时,T113-S3内部的BROM会识别加载头,并将bootloader程序加载到T113-S3的内部SRAM(0x00020000),并运行。然后bootloader会读取spinor flash里面(0x00100000-0x00200000)的内容到DDR(0x40000000),并跳转到DDR运行。所以裸机程序需要烧写到spinor flash的(0x00100000-0x00200000)处。
/* Boot head information for BROM */
b __iar_program_start ;DCD 0xEA000016
DCB 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
DCD 0x12345678 /* checksum */
DCD 20000 /* spl size:little large then .bin*/
DCD 0x30 /* boot header size */
DCD 0x30303033 /* boot header version */
DCD 0x00020000 /* return value */
DCD 0x00028000 /* run address */
DCD 0x0 /* eGON version */
DCB 0x00, 0x00, 0x00, 0x00 /* platform information - 8byte */
3.此bootloader用IAR编译完会生成bootloader.bin,然后需要使用mksunxi.exe,把.bin文件的大小信息添加到加载头。
mksunxi.exe bootloader.bin。
4.然后将带有大小信息的bootloader.bin,烧写到spinor flash的0x00000000处。
xfel.exe spinor write 0x0 bootloader.bin。
5.重新启动,串口会打印信息,串口使用的是PB4,PB5引脚,波特率115200.
------BootLoader Info---------------------
BootLoader spinor memory map:
AWBoot: 0x00000000-0x00010000 64KB
User Bin: 0x00100000-0x00200000 1MB
BootLoader sdram memory map:
Bare ROM: 0x40000000-0x40100000 1MB
Bare RAM: 0x40100000-0x40200000 1MB
------BootLoader Start--------------------
DRAM: TYPE = DDR3, CLK = 792 MHz
DRAM: SIZE = 128MB
CLK: PLL_CPUX = 1200MHz
CLK: PLL_PERI(2X) = 1200MHz
CLK: PLL_PERI(1X) = 600MHz
CLK: PLL_PERI(800) = 800MHz
CLK: PLL_DDR = 1584MHz
SPI: CLKIN = 600MHz, DIV = 3, N = 1, M = 3
SPI: CLOCK ACTUAL = 100MHz MCLK = 200MHz
DMA: USE CHANNEL 0
SPI-NOR: MFR:0xEF DEV:0x4019
SPI NOR: READ USER BIN TIME:20986uS
------BootLoader Jump Successed-----------
bootloader使用的的spinor空间在0x00000000-0x00010000预留了64KB。
裸机程序使用的spinor空间在0x00100000-0x00200000预留了1MB。
二、IAR下的LED工程
1.编译运行
iar_project\project\1_demo\iar目录下面有IAR工程,可以用Jlink连接板子进行仿真,也可以编译完成后生成一个demo.bin文件,烧写到spinor(0x00100000)。链接地址是0x40000000
可以用如下命令烧写到spinor
xfel.exe spinor write 0x100000 demo.bin`命令烧写到spinor.
重启后,会发现bootloader已经将led程序加载并运行起来,闪灯。
总的来说,就是先烧写bootloader到spinor的0x0处,再烧写demo.bin到spinor的0x00100000处
这样重启后就会先运行bootloader,再运行裸机程序demo.bin。
完整工程分享到这里:
t113-s3.rar
离线
可以的!全志的SOC的裸机设计,bootloader的demo值得研究
离线
点赞。我喜欢裸机。不喜欢系统。
裸机
1.资源占用小,尤其是RAM。
2.实时响应可控,想要实时性高的用中断,实时性低的用轮训。
离线
感谢分享 目前裸机对我来说最大的痛点就是那些个sdio的wifi模块没法子用起来了 只得上重量级选手Linux了
离线
不错, 有空研究一下
在线
有外部RAM实始化加载就好
离线
这个可以啊,不知道有没有别的外设驱动
离线
太爱了,感觉使用IAR类裸机调试方便得不要不要的,特别是调试BUG或者对接新模块等
离线
@zengyi703
付费下载学习下下。。谢谢 支持自动开启双核工作的吗?
离线
难度太高了,实在是从中学不到什么了.
离线
Dual-core baremetal t113-s3 project here
https://github.com/ua1arn/hftrx/tree/develop
最近编辑记录 GenaSPB (2023-09-22 01:12:57)
离线
资料开放吗?用裸机的话
离线
T113是双核吧,怎么在裸机中让两个核都运行呢
离线
Start second core on T113-s3:
// 3.4.2.4 CPU0 Hotplug Process
//
// The Hotplug Flag Register is 0x070005C0.
// The Soft Entry Address Register is 0x070005C4.
// 3.4.2.3 NON_CPU0 Boot Process
//
// The Soft Entry Address Register of CPU0 is 0x070005C4
// The Soft Entry Address Register of CPU1 is 0x070005C8
#define HARDWARE_HOTPLUG_FLAG 0xFA50392F // CPU Hotplug Flag value
// In Allwinner h133 this i/o block named R_CPUCFG
//#define HARDWARE_NCORES 2
static void aarch32_mp_cpuN_start(uintptr_t startfunc, unsigned targetcore)
{
const uint32_t CORE_RESET_MASK = UINT32_C(1) << targetcore; // CPUx_CORE_RESET
volatile uint32_t * const rvaddr = ((volatile uint32_t *) (R_CPUCFG_BASE + 0x1c4 + targetcore * 4));
ASSERT(startfunc != 0);
ASSERT(targetcore != 0);
C0_CPUX_CFG->C0_RST_CTRL &= ~ CORE_RESET_MASK;
* rvaddr = startfunc;
ASSERT(* rvaddr == startfunc);
dcache_clean_all(); // startup code should be copied in to sysram for example.
C0_CPUX_CFG->C0_RST_CTRL |= CORE_RESET_MASK;
}
Each core has own cache, MMU, part of GIC
Registers definitions: https://whycan.com/files/members/12476/t113s3.zip
最近编辑记录 GenaSPB (2023-10-21 00:50:26)
离线
我也用mksunxi.exe生成了bin文件,但是就是在nand flash跑不起来,是不是mksunxi.exe有什么要修改的?
离线
楼主,你的串口确定有打印吗?为啥我烧了bootloader.bin后重启灯是亮了但串口一直没打印啊?
离线
Will jlink v9 works with the T113?
离线
Will jlink v9 works with the T113?
JLink v9 doesn't support SWD multidrop, so it doesn't support debugging dual core at the same time but it works with single core.
https://whycan.com/t_8407.html
离线
vasilius 说:Will jlink v9 works with the T113?
JLink v9 doesn't support SWD multidrop, so it doesn't support debugging dual core at the same time but it works with single core.
https://whycan.com/t_8407.html
Thx. Have ordered V9 on local market.
I just want in attach mode to connect to CPU0 and check setup of peripheries.
Want to load with xfel and debug with jtag.
For second core plan to use UART.
离线
什么时候裸机能支持USB HOST,可以连U盘,可以连USB WIFI蓝牙,我就什么时候切裸机,Linux实在臃肿
离线
Some usb wifi dongles are closed sources. No specifications avaliable
最近编辑记录 GenaSPB (2023-11-13 03:11:08)
离线
赞一个,就是外设驱动少了点
离线
刚好手里有块T113-S3的板子吃灰很久了,感谢楼主分享,下载下来试试。
离线
包含了哪些外设?
离线
128M内存跑裸机那不得飞起
离线
不错,正想在T113上跑rtos,一直没成功哎,苦闷得很,希望能借鉴楼主的demo来运行成功
离线
楼主的思维,让我们从裸机跳转到操作系统有了阶梯
离线
T113S3如果可以跑裸机的话
那就实在不错啊
离线
裸机干脆利落,不过要有一个双核调度
离线
@LinjieGuo
看看串口3的时钟打开了没
离线
串口3的时钟应该是开了,工程里面根据id作为偏移量开启时钟的。
void sunxi_usart_init(sunxi_usart_t *usart)
{
uint32_t addr;
uint32_t val;
/* Config usart TXD and RXD pins */
sunxi_gpio_init(usart->gpio_tx.pin, usart->gpio_tx.mux);
sunxi_gpio_init(usart->gpio_rx.pin, usart->gpio_rx.mux);
/* Open the clock gate for usart */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << usart->id;
write32(addr, val);
/* Deassert USART reset */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << (16 + usart->id);
write32(addr, val);
/* Config USART to 115200-8-1-0 */
addr = usart->base;
write32(addr + 0x04, 0x0);
write32(addr + 0x08, 0xf7);
write32(addr + 0x10, 0x0);
val = read32(addr + 0x0c);
val |= (1 << 7);
write32(addr + 0x0c, val);
write32(addr + 0x00, 0xd & 0xff);
write32(addr + 0x04, (0xd >> 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);
}
时钟相关代码应该是这几行。
/* Open the clock gate for usart */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << usart->id;
write32(addr, val);
/* Deassert USART reset */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << (16 + usart->id);
write32(addr, val);
最近编辑记录 LinjieGuo (2024-02-27 13:40:32)
离线
@LinjieGuo
我手上只有D1s,测试了下PB6 PB7上uart3,打印正常,两个芯片pin to pin,t113s3应该问题不大,参考下xboot中t113s3 uart代码
离线
@zengyi703
谢谢分享,请问裸机的话
网络、usb-host、MIPI显示、音频wav播放,这些有没有调通?
离线
什么时候裸机能支持USB HOST,可以连U盘,可以连USB WIFI蓝牙,我就什么时候切裸机,Linux实在臃肿
我找到一个资料,你可以参考下
https://github.com/robots/allwinner_t113
T113裸机的话,我这边需要pwm、mipi、网络、音频wav播放,这些资料目前没找到
挺头疼的
离线
mksunxi.exe bootloader.bin 出错
The bootloader head has been fixed, spl size is -455278592 bytes
离线
芯片资料是开放的, 用裸机全部需要自己处理
离线
感谢分享 目前裸机对我来说最大的痛点就是那些个sdio的wifi模块没法子用起来了 只得上重量级选手Linux了
离线
printf函数兼容性差,裸机程序中最好不用printf,用iar(9.32)重新编译后烧写到flash中,串口没有任何输出,禁用printf后程序就正常了
离线
这个串口可以打印信息,该怎么样通过中断接收串口数据呢,没试成功,有大佬试过吗
离线
t113-s3.rar
这个工程下载,可以烧写,demo可以开机启动,但是jlink 仿真有问题,能否给你jlink和T113的连接图,demo 仿真配置图
离线
t113-s3-20240521-裸机ok.rar
这是我修改了SPI NAND flash boot 启动
离线
T113如果跑系统的话,大佬们一般是跑Tianlinux还是自己移植三大件
离线
裸机程序,多核怎么切换处理?
离线
从哪能找到mipi相关的任何资料呢?
离线
厉害,可以借鉴学习下 最近买了块t113-s3开发板 准备开发dvr 但发现难度大,还要多学习
离线
Headers for use with CMSIS_5 may be found here:
https://github.com/ua1arn/hftrx/tree/develop/arch/aw_t113x
Audio and other in same place. Two (and risc-v core for t113-s4) code also.
最近编辑记录 GenaSPB (2024-10-09 20:14:24)
离线
这个片子有跑过rtos的么
离线