Skip to content

Commit efc16b5

Browse files
committed
[bsp][nxp][imx] Fix i.MX91 access peripheral issues
1 parent e441264 commit efc16b5

File tree

19 files changed

+428
-176
lines changed

19 files changed

+428
-176
lines changed

.github/ALL_BSP_COMPILE.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,8 @@
387387
"SUB_RTT_BSP": [
388388
"qemu-virt64-aarch64",
389389
"raspberry-pi/raspi3-64",
390-
"raspberry-pi/raspi4-64"
390+
"raspberry-pi/raspi4-64",
391+
"nxp/imx/imx91"
391392
]
392393
},
393394
{

bsp/Copyright_Notice.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,17 @@ Path:
325325

326326
- bsp/imx6ul/platform
327327

328+
### imx91
329+
330+
License: bsd-new
331+
332+
Copyright: Copyright 2014-2016 Freescale Semiconductor, Inc.
333+
Copyright 2016-2025 NXP
334+
335+
Path:
336+
337+
- bsp/nxp/imx/imx91/drivers/sdk
338+
328339
### imxrt
329340

330341
License: clear-bsd

bsp/nxp/imx/imx91/.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1469,7 +1469,7 @@ CONFIG_SOC_MIMX91X1D=y
14691469
#
14701470
# Hardware Drivers Config
14711471
#
1472-
# CONFIG_BSP_USING_EARLY_CONSOLE is not set
1472+
CONFIG_BSP_USING_EARLY_CONSOLE=y
14731473
CONFIG_BSP_USING_UART1=y
14741474
CONFIG_BSP_USING_GIC=y
14751475
CONFIG_BSP_USING_GICV3=y
73 KB
Loading
10.8 KB
Loading
17.7 KB
Loading

bsp/nxp/imx/imx91/README.md

Lines changed: 198 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,215 @@
1-
# FRDM-IMX91 RT-Thread BSP
1+
# FRDM-IMX91 板级支持包 使用说明
22

3-
This folder contains the RT-Thread BSP for the NXP FRDM-IMX91 development board.
3+
本目录包含NXP FRDM-IMX91 开发板的板级支持包代码。
44

5-
## Board Overview
5+
## 1. 简介
66

7-
## Build and Run
7+
### 1.1 i.MX91系列处理器简介
88

9-
### Setup RT-Thread Development Environment
9+
i.MX 91系列采用了可扩展的Arm® Cortex®-A55内核,其主频高达1.4GHz,支持新一代LPDDR4内存以延长平台寿命,支持双千兆以太网和双USB端口,以及面向医疗、工业和消费物联网市场细分领域的丰富外设。
1010

11-
### Setup Network and TFTP Server for FRDM-IMX91
1211

13-
### Build RT-Thread BSP for FRDM-IMX91
1412

15-
1. Clone the RT-Thread repository:
16-
```
17-
git clone https://github.com/RT-Thread/rt-thread.git
18-
```
13+
### 1.2 FRDM-i.MX91开发板简介
1914

20-
2. Navigate to the BSP folder:
21-
```
22-
cd rt-thread/bsp/nxp/imx/imx91
23-
```
15+
FRDM i.MX 91开发板是一款低成本、紧凑型开发板,采用i.MX 91应用处理器。该板配备板载IW610模块,集成了恩智浦的三频解决方案,支持Wi-Fi 6、BLE 5.4和802.15.4,适用于开发现代工业和物联网应用。该开发板包含LPDDR4、用于快速启动的eMMC存储、PMIC以及扩展功能。
2416

25-
3. Build the BSP:
26-
```
27-
scons -j 8
28-
```
17+
FRDM i.MX 91开发板是一款入门级紧凑型开发板,采用i.MX 91应用处理器。
2918

30-
4. copy the `rtthread.bin` to the TFTP server working directory:
31-
```
32-
cp rtthread.bin /path/to/tftp_work_dir/
33-
```
19+
![GS-FRDM-IMX91-IMG1](README.assets/GS-FRDM-IMX91-IMG1.webp)
3420

35-
### Run RT-Thread on FRDM-IMX91 with u-boot
21+
开发板主要硬件资源:
22+
23+
| 资源 | 简介 |
24+
| ------------------ | ------------------------------------------------------------ |
25+
| 处理器 | ◆ i.MX 91应用处理器<br />◆ [email protected]<br />◆ EdgeLock®安全区域 |
26+
| 存储器 | ◆ 1GB LPDDR4<br />◆ 8GB eMMC5.1<br />◆ MicroSD插槽<br />◆ EEPROM |
27+
| 显示器和摄像头接口 | ◆ 并行RGB LCD接口(40引脚扩展接口)<br />◆ 并行摄像头接口(40引脚扩展接口) |
28+
| 无线 | ◆ u-blox MAYA-W476-00B三频Wi-Fi 6/BLE 5.4/802.15.4模块 |
29+
| 音频 | ◆ 3.5mm耳机插孔 |
30+
| 连接 | ◆ USB2.0 Type-C连接器<br />◆ USB2.0 type A连接器 <br />◆ 两个GbE RJ45 <br />◆ CAN(HDR) <br />◆ 40引脚(2x20) <br />◆ 扩展接口 <br />◆ I²C HDR <br />◆ ADC HDR |
31+
| 调试 | ◆ SWD连接器 <br />◆ 通过USB Type C的UART |
32+
33+
34+
35+
### 1.3 开发板和PC之间的连接
36+
37+
在FRDM i.MX 91开发板上调测RT-Thread的过程中,需要使用到的接口有:
38+
39+
1. POWER(P1),USB供电接口,用于向开发板供电;
40+
2. DEBUG(P16),带有USB转串口芯片,用于U-Boot和RT-Thread日志输出、命令行交互;
41+
3. ENET1(P4)或者ENET2(P3),以太网口,用于网络下载编译生成的RT-Thread固件;
42+
43+
44+
45+
## 2. 编译
46+
47+
### 2.1 下载AArch64工具链
48+
49+
从ARM开发者网站下载AArch64裸机工具链,
50+
51+
下载页面: [Arm GNU Toolchain Downloads – Arm Developer](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads)
52+
53+
例如,64位Windows主机上下载: https://developer.arm.com/-/media/Files/downloads/gnu/14.3.rel1/binrel/arm-gnu-toolchain-14.3.rel1-mingw-w64-x86_64-aarch64-none-elf.zip
54+
55+
例如,下载后解压到本地路径:`D:\ARM\arm-gnu-toolchain-14.3.rel1-mingw-w64-x86_64-aarch64-none-elf`
56+
57+
58+
59+
### 2.2 下载RT-Thread Env工具
60+
61+
下载页面:[rt-thread.org/download.html#download-rt-thread-env-tool](https://www.rt-thread.org/download.html#download-rt-thread-env-tool)
62+
63+
64+
65+
### 2.3 下载RT-Thread源代码
66+
67+
在Env环境中,使用git命令下载RT-Thread源代码,例如:
3668

3769
```sh
70+
git clone https://github.com/RT-Thread/rt-thread.git
71+
```
72+
73+
74+
75+
### 2.4 编译FRDM-i.MX 91目标
76+
77+
在Env环境中,转到`i.MX 91`的BSP目录:
78+
79+
```sh
80+
cd bsp/nxp/imx/imx91/
81+
```
82+
83+
然后,设置工具链路径(Windows Env环境):
84+
85+
```bat
86+
set RTT_EXEC_PATH=D:\ARM\arm-gnu-toolchain-14.3.rel1-mingw-w64-x86_64-aarch64-none-elf\bin
87+
```
88+
89+
或者(bash):
90+
91+
```sh''
92+
export RTT_EXEC_PATH=/path/to/aarch64-none-elf/bin
93+
```
94+
95+
接着,执行`scons`命令开始编译:
96+
97+
```sh
98+
scons -j 8
99+
```
100+
101+
102+
103+
## 3.下载
104+
105+
开发板默认固件带有U-Boot启动加载器,开机3秒内通过串口发送换行符,可以进入U-Boot命令行界面。
106+
107+
### 3.1 准备U-Boot网络环境
108+
109+
将开发板和PC连接到同一个路由器。
110+
111+
例如,PC的IP地址为:`192.168.0.101`
112+
113+
在开发板的U-Boot命令行界面内,设置FRDM-i.MX为静态IP:
114+
115+
```sh
116+
setenv ipaddr 192.168.0.120
117+
```
118+
119+
或者从路由器动态获取IP:
120+
121+
```sh
122+
dhcp
123+
```
124+
125+
成功后,可以使用ping命令测试是否可以访问PC:
126+
127+
```sh
128+
ping 192.168.0.101
129+
```
130+
131+
成功则表示网络环境正常,可以执行后续步骤。
132+
133+
134+
135+
### 3.2 安装TFTP服务
136+
137+
Windows系统可以使用Tftpd,下载链接: [Releases · PJO2/tftpd64](https://github.com/PJO2/tftpd64/releases/)
138+
139+
例如,下载portable免安装版本: https://github.com/PJO2/tftpd64/releases/download/v4.74/tftpd64_portable_v4.74.zip
140+
141+
启动后,设置TFTP工作目录:
142+
143+
![image-20251210021421740](README.assets/image-20251210021421740.png)
144+
145+
146+
147+
### 3.3 拷贝rtthread.bin到TFTP工作目录
148+
149+
在PC的Env环境中,将 `rtthread.bin` 拷贝到TFTP工作目录:
150+
```bat
151+
copy /Y rtthread.bin D:\PortableSoftwareApps\tftpd64_portable_v4.74\work\
152+
```
153+
154+
或者:
155+
156+
```sh
157+
cp rtthread.bin /path/to/tftp_work_dir/
158+
```
159+
160+
161+
162+
### 3.4 下载rtthread.bin到开发板内存中
163+
164+
在开发板的U-Boot命令行界面中,首先执行如下命令,设置TFTP服务地址(PC的IP地址):
165+
166+
```sh
167+
setenv serverip 192.168.0.101
168+
```
169+
170+
然后,继续在开发板的U-Boot命令行界面中,执行如下命令,将`rtthread.bin`下载到内存中:
171+
172+
```sh
173+
tftp 0x80000000 rtthread.bin
174+
```
175+
176+
下载的目标内存地址为:`0x80000000`
177+
178+
179+
180+
## 4. 运行
181+
182+
完成前述步骤后,在开发板的 U-Boot 命令行界面中,继续执行以下命令,以跳转至 `0x80000000` 地址并执行代码:
183+
184+
```sh
185+
dcache flush
186+
icache flush
187+
go 0x80000000
188+
```
189+
190+
每次开发板上电启动后,均需执行上述 U-Boot 命令,RT-Thread 方可正常运行。这在需要反复调试时显得不够便捷。
191+
192+
为此,可将以上命令写入 U-Boot 的环境变量 `bootcmd` 中,从而实现开机自动执行,便于后续调试。具体操作命令如下:
193+
194+
```sh
195+
setenv ipaddr 192.168.0.120
196+
setenv serverip 192.168.0.101
38197
setenv bootcmd "tftp 0x80000000 rtthread.bin; dcache flush; icache flush; go 0x80000000"
39198
saveenv
40199
reset
41200
```
201+
202+
其中,`saveenv` 命令用于保存环境变量的值,确保重启后依然生效;最后的 `reset` 为重启命令。
203+
204+
执行效果如下图所示:
205+
206+
![image-20251210220620728](README.assets/image-20251210220620728.png)
207+
208+
## 5. 参考链接
209+
210+
1. 维护人: [xusiwei](https://github.com/xusiwei)
211+
2. AArch64工具链下载页面: [Arm GNU Toolchain Downloads – Arm Developer](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads)
212+
3. Tftp64下载页面:https://github.com/PJO2/tftpd64/releases
213+
4. FRDM-i.MX91开发板介绍:[FRDM i.MX 91 Development Board | NXP 半导体](https://www.nxp.com.cn/design/design-center/development-boards-and-designs/FRDM-IMX91)
214+
5. i.MX91处理器介绍: [i.MX 91 Applications Processors Family | NXP 半导体](https://www.nxp.com.cn/products/i.MX91)
215+

bsp/nxp/imx/imx91/drivers/board.c

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,29 @@
2323
#include <limits.h>
2424

2525
#define DRAM_MAP_START KERNEL_BOOT_ADDR
26-
#define DRAM_MAP_SIZE (64 * 1024 * 1024) // part of DRAM
26+
#define DRAM_MAP_SIZE MB_SIZE(256)
2727

2828
#define MEM_DESC(vaddr_start, size, paddr_start, attr) \
2929
vaddr_start, (vaddr_start + size - 1uL), paddr_start, attr
3030

31-
static volatile unsigned long MMUTable[512*4] __attribute__((aligned(4 * 1024)));
31+
extern volatile unsigned long MMUTable[];
3232

33-
struct mem_desc platform_mem_desc[] = {
34-
{MEM_DESC(DRAM_MAP_START, DRAM_MAP_SIZE, DRAM_MAP_START, NORMAL_MEM)},
35-
// {MEM_DESC(LPUART1_BASE, LPUART1_SIZE, LPUART1_BASE, DEVICE_MEM)}, // 0x4438_0000
36-
// {MEM_DESC(CCM_CTRL_BASE, CCM_CTRL_SIZE, CCM_CTRL_BASE, DEVICE_MEM)}, // 0x4445_8000
37-
// {MEM_DESC(GIC_DISTRIBUTOR_BASE, GIC_DISTRIBUTOR_SIZE, GIC_DISTRIBUTOR_BASE, DEVICE_MEM)}, // 0x4800_0000
38-
// {MEM_DESC(GIC_REDISTRIBUTOR_BASE, GIC_REDISTRIBUTOR_SIZE, GIC_REDISTRIBUTOR_BASE, DEVICE_MEM)}, // 0x4804_0000
33+
static struct mem_desc platform_mem_desc[] = {
34+
{ MEM_DESC(DRAM_MAP_START, DRAM_MAP_SIZE, DRAM_MAP_START, NORMAL_MEM) }, // 0x8000_0000
35+
{ MEM_DESC(LPUART1_BASE, LPUART1_SIZE, LPUART1_BASE, DEVICE_MEM) }, // 0x4438_0000
36+
{ MEM_DESC(CCM_CTRL_BASE, CCM_CTRL_SIZE, CCM_CTRL_BASE, DEVICE_MEM) }, // 0x4445_8000
37+
{ MEM_DESC(GIC_DISTRIBUTOR_BASE, GIC_DISTRIBUTOR_SIZE, GIC_DISTRIBUTOR_BASE, DEVICE_MEM) }, // 0x4800_0000
38+
{ MEM_DESC(GIC_REDISTRIBUTOR_BASE, GIC_REDISTRIBUTOR_SIZE, GIC_REDISTRIBUTOR_BASE, DEVICE_MEM) }, // 0x4804_0000
3939
};
4040

41-
const rt_uint32_t platform_mem_desc_size = sizeof(platform_mem_desc)/sizeof(platform_mem_desc[0]);
41+
static const rt_uint32_t platform_mem_desc_size = sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0]);
4242

43-
rt_region_t init_page_region = {
44-
(rt_size_t)PAGE_START,
45-
(rt_size_t)PAGE_END,
46-
};
43+
static rt_region_t init_page_region;
4744

4845
static rt_base_t get_sctlr_el1()
4946
{
5047
rt_base_t sctlr = 0;
51-
__asm__ volatile ("mrs %0, sctlr_el1" : "=r"(sctlr));
48+
__asm__ volatile("mrs %0, sctlr_el1" : "=r"(sctlr));
5249
return sctlr;
5350
}
5451

@@ -57,18 +54,21 @@ static rt_base_t get_sctlr_el1()
5754
*/
5855
void rt_hw_board_init(void)
5956
{
60-
rt_hw_mmu_map_init(&rt_kernel_space, (void*)0x080000000000, 0x10000000, (size_t *) MMUTable, 0);
57+
rt_hw_earlycon_ioremap();
58+
rt_hw_earlycon_print_hex("sctlr_el1: ", get_sctlr_el1());
59+
rt_hw_mmu_map_init(&rt_kernel_space, (void *)0x080000000000, 0x10000000, (size_t *)MMUTable, 0);
60+
61+
init_page_region.start = BOARD_PAGE_START;
62+
init_page_region.end = BOARD_PAGE_END;
6163
rt_page_init(init_page_region);
64+
6265
rt_hw_mmu_setup(&rt_kernel_space, platform_mem_desc, platform_mem_desc_size);
6366

64-
#ifdef RT_USING_HEAP
67+
#ifdef RT_USING_HEAP
6568
/* initialize system heap */
66-
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
69+
rt_system_heap_init((void *)BOARD_HEAP_BEGIN, (void *)BOARD_HEAP_END);
6770
#endif
6871

69-
/* map LPUART1/CCM_CTRL/GIC_DISTRIBUTOR/GIC_REDISTRIBUTOR virtual address to equals physical address */
70-
rt_ioremap_early((void*)LPUART1_BASE, GIC_REDISTRIBUTOR_BASE + GIC_REDISTRIBUTOR_SIZE - LPUART1_BASE);
71-
7272
/* initialize hardware interrupt */
7373
rt_hw_interrupt_init();
7474

@@ -80,7 +80,4 @@ void rt_hw_board_init(void)
8080

8181
rt_components_board_init();
8282
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
83-
rt_kprintf("[rt_hw_board_init] rt_kprintf works!\n");
8483
}
85-
86-
/*@}*/

bsp/nxp/imx/imx91/drivers/board.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* Date Author Notes
88
* 2025-08-10 Siwei Xu Add i.MX91 SDK
99
* 2025-09-15 Siwei Xu Fix LPUART driver
10+
* 2025-12-10 Siwei Xu Fix ioremap issues
1011
*/
1112

1213
#ifndef __BOARD_H__
@@ -15,16 +16,18 @@
1516
#include "imx91.h"
1617
#include "rtconfig.h"
1718

18-
extern int __bss_end;
19-
#define HEAP_BEGIN ((void*)&__bss_end)
20-
2119
#ifndef KERNEL_BOOT_ADDR
2220
#define KERNEL_BOOT_ADDR (ARCH_RAM_OFFSET + ARCH_TEXT_OFFSET)
2321
#endif
2422

25-
#define HEAP_END ((void*)((char*) HEAP_BEGIN + 32 * 1024 * 1024))
26-
#define PAGE_START ((size_t)HEAP_END)
27-
#define PAGE_END ((size_t)PAGE_START + 128 * 1024 * 1024)
23+
/* defined in linker script */
24+
extern unsigned char __bss_end;
25+
26+
#define BOARD_PAGE_START RT_ALIGN((rt_base_t) & __bss_end, KB_SIZE(4))
27+
#define BOARD_PAGE_END (BOARD_PAGE_START + MB_SIZE(1))
28+
29+
#define BOARD_HEAP_BEGIN (BOARD_PAGE_END)
30+
#define BOARD_HEAP_END (BOARD_HEAP_BEGIN + MB_SIZE(32))
2831

2932
void rt_hw_board_init(void);
3033

0 commit comments

Comments
 (0)