sync branch rt-smart. (#6641)

* Synchronize the code of the rt mart branch to the master branch.
  * TTY device
  * Add lwP code from rt-smart
  * Add vnode in DFS, but DFS will be re-write for rt-smart
  * There are three libcpu for rt-smart:
    * arm/cortex-a, arm/aarch64
    * riscv64

Co-authored-by: Rbb666 <zhangbingru@rt-thread.com>
Co-authored-by: zhkag <zhkag@foxmail.com>
This commit is contained in:
guo
2022-12-03 12:07:44 +08:00
committed by GitHub
parent aaf5462c6d
commit ecf2d82159
1693 changed files with 389530 additions and 9680 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -21,27 +21,28 @@ int mnt_init(void)
{
rt_thread_delay(RT_TICK_PER_SECOND);
if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
if (dfs_mount("sd", "/", "elm", 0, 0) == 0)
{
LOG_I("file system initialization done!\n");
return 0;
}
else
{
LOG_W("[sd0] File System on SD ('sd0') initialization failed!");
LOG_W("[sd0] Try to format and re-mount...");
if (dfs_mkfs("elm", "sd0") == 0)
LOG_W("[sd] File System on SD ('sd') initialization failed!");
LOG_W("[sd] Try to format and re-mount...");
if (dfs_mkfs("elm", "sd") == 0)
{
if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
if (dfs_mount("sd", "/", "elm", 0, 0) == 0)
{
LOG_I("[sd0] File System on SD ('sd0') initialized!");
LOG_I("[sd] File System on SD ('sd') initialized!");
return 0;
}
}
LOG_E("[sd0] File System on SD ('sd0') initialization failed!");
LOG_E("[sd] File System on SD ('sd') initialization failed!");
return -1;
}
}
INIT_ENV_EXPORT(mnt_init);
#endif

View File

@@ -3,6 +3,8 @@ menu "Hardware Drivers Config"
config SOC_VEXPRESS_A9
bool
select ARCH_ARM_CORTEX_A9
select RT_USING_CACHE
select ARCH_ARM_MMU
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
select RT_USING_GIC_V2

View File

@@ -18,11 +18,21 @@
#include "drv_timer.h"
#include <mmu.h>
#ifdef RT_USING_USERSPACE
#include <page.h>
#include <lwp_arch.h>
#endif
#ifdef RT_USING_USERSPACE
struct mem_desc platform_mem_desc[] = {
{KERNEL_VADDR_START, KERNEL_VADDR_START + 0x0fffffff, KERNEL_VADDR_START + PV_OFFSET, NORMAL_MEM}
};
#else
struct mem_desc platform_mem_desc[] = {
{0x10000000, 0x50000000, 0x10000000, DEVICE_MEM},
{0x60000000, 0xe0000000, 0x60000000, NORMAL_MEM}
{0x60000000, 0x70000000, 0x60000000, NORMAL_MEM}
};
#endif
const rt_uint32_t platform_mem_desc_size = sizeof(platform_mem_desc)/sizeof(platform_mem_desc[0]);
@@ -36,12 +46,37 @@ void idle_wfi(void)
}
/**
* This function will initialize beaglebone board
* This function will initialize board
*/
rt_mmu_info mmu_info;
extern size_t MMUTable[];
#ifdef RT_USING_USERSPACE
rt_region_t init_page_region = {
(uint32_t)PAGE_START,
(uint32_t)PAGE_END,
};
#endif
void rt_hw_board_init(void)
{
#ifdef RT_USING_USERSPACE
rt_hw_mmu_map_init(&mmu_info, (void*)0xf0000000, 0x10000000, MMUTable, PV_OFFSET);
rt_page_init(init_page_region);
rt_hw_mmu_ioremap_init(&mmu_info, (void*)0xf0000000, 0x10000000);
arch_kuser_init(&mmu_info, (void*)0xffff0000);
#else
rt_hw_mmu_map_init(&mmu_info, (void*)0x80000000, 0x10000000, MMUTable, 0);
rt_hw_mmu_ioremap_init(&mmu_info, (void*)0x80000000, 0x10000000);
#endif
/* initialize hardware interrupt */
rt_hw_interrupt_init();
/* initialize system heap */
rt_system_heap_init(HEAP_BEGIN, HEAP_END);

View File

@@ -11,9 +11,15 @@
#ifndef __BOARD_H__
#define __BOARD_H__
#include <rtconfig.h>
#include <realview.h>
#include "vexpress_a9.h"
#include "mmu.h"
#ifdef RT_USING_LWP
#include "ioremap.h"
#endif
#if defined(__CC_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN ((void*)&Image$$RW_IRAM1$$ZI$$Limit)
@@ -22,8 +28,16 @@ extern int __bss_end;
#define HEAP_BEGIN ((void*)&__bss_end)
#endif
#define HEAP_END (void*)(0x60000000 + 8 * 1024 * 1024)
#ifdef RT_USING_USERSPACE
#define HEAP_END (void*)(KERNEL_VADDR_START + 16 * 1024 * 1024)
#define PAGE_START HEAP_END
#define PAGE_END (void*)(KERNEL_VADDR_START + 128 * 1024 * 1024)
#else
#define HEAP_END (void*)(0x60000000 + 64 * 1024 * 1024)
#endif
void rt_hw_board_init(void);
extern rt_mmu_info mmu_info;
#endif

View File

@@ -12,7 +12,14 @@
#include <stdlib.h>
#include <rtthread.h>
#ifdef RT_USING_LWP
#include <lwp.h>
#include <lwp_user_mm.h>
#endif
#include <board.h>
#include "drv_clcd.h"
#include "rt_lcd.h"
#define CLCD_WIDTH (BSP_LCD_WIDTH)
#define CLCD_HEIGHT (BSP_LCD_HEIGHT)
@@ -51,7 +58,7 @@ static rt_err_t drv_clcd_init(struct rt_device *device)
{
struct drv_clcd_device *lcd = CLCD_DEVICE(device);
lcd = lcd; /* nothing, right now */
(void)lcd; /* nothing, right now */
return RT_EOK;
}
@@ -82,8 +89,30 @@ static rt_err_t drv_clcd_control(struct rt_device *device, int cmd, void *args)
}
break;
default:
return -RT_EINVAL;
case FBIOGET_FSCREENINFO:
{
#ifdef RT_USING_USERSPACE
struct fb_fix_screeninfo *info = (struct fb_fix_screeninfo *)args;
strncpy(info->id, "lcd", sizeof(info->id));
info->smem_len = lcd->width * lcd->height * 2;
info->smem_start = (uint32_t)lwp_map_user_phy(lwp_self(), RT_NULL, lcd->fb,
info->smem_len, 1);
info->line_length = lcd->width * 2;
#endif
}
break;
case FBIOGET_VSCREENINFO:
{
struct fb_var_screeninfo *info = (struct fb_var_screeninfo *)args;
info->bits_per_pixel = 16;
info->xres = lcd->width;
info->yres = lcd->height;
}
break;
case FBIOGET_DISPINFO:
break;
}
return RT_EOK;
@@ -111,21 +140,32 @@ int drv_clcd_hw_init(void)
_lcd.width = CLCD_WIDTH;
_lcd.height = CLCD_HEIGHT;
_lcd.fb = rt_malloc(_lcd.width * _lcd.height * 2 /*RGB565 2 Bytes*/);
rt_kprintf("try to allocate fb... | w - %d, h - %d | ", _lcd.width, _lcd.height);
#ifdef RT_USING_USERSPACE
_lcd.fb = rt_pages_alloc(rt_page_bits(_lcd.width * _lcd.height * 2));
#else
_lcd.fb = rt_malloc(_lcd.width * _lcd.height * 2);
#endif
rt_kprintf("done!\n");
rt_kprintf("fb => 0x%08x\n", _lcd.fb);
if (_lcd.fb == NULL)
{
rt_kprintf("initialize frame buffer failed!\n");
return -1;
}
memset(_lcd.fb, 0xff, _lcd.width * _lcd.height * 2);
plio = (PL111MMIO*)PL111_IOBASE;
plio->tim0 = 0x3F1F3C00 | ((CLCD_WIDTH/16 - 1) << 2);
#ifdef RT_USING_USERSPACE
plio = (PL111MMIO *)rt_ioremap((void*)PL111_IOBASE, 0x1000);
#endif
plio->tim0 = 0x3F1F3C00 | ((CLCD_WIDTH / 16 - 1) << 2);
plio->tim1 = 0x080B6000 | (CLCD_HEIGHT - 1);
plio->upbase = (uint32_t)_lcd.fb;
#ifdef RT_USING_USERSPACE
plio->upbase += PV_OFFSET;
#endif
/* 16-bit 565 color */
plio->control = 0x1921 | (0x6 << 1);

View File

@@ -431,9 +431,11 @@ int rt_hw_keyboard_init(void)
rt_uint8_t value;
rt_uint32_t id;
struct keyboard_pl050_pdata_t *pdat;
virtual_addr_t virt = (virtual_addr_t)KEYBOARD_ADDRESS;
virtual_addr_t virt;
int irq = KEYBOARD_IRQ_NUM;
virt = (virtual_addr_t)rt_ioremap((void*)KEYBOARD_ADDRESS, 0x1000);
id = (((read32(virt + 0xfec) & 0xff) << 24) |
((read32(virt + 0xfe8) & 0xff) << 16) |
((read32(virt + 0xfe4) & 0xff) << 8) |

View File

@@ -267,6 +267,9 @@ int rt_hw_mouse_init(void)
virtual_addr_t virt = MOUSE_ADDRESS;
int irq = MOUSE_IRQ_NUM;
#ifdef RT_USING_LWP
virt = (virtual_addr_t)rt_ioremap((void*)MOUSE_ADDRESS, 0x1000);
#endif
id = (((read32(virt + 0xfec) & 0xff) << 24) |
((read32(virt + 0xfe8) & 0xff) << 16) |
((read32(virt + 0xfe4) & 0xff) << 8) |

View File

@@ -15,6 +15,7 @@
#include <stdint.h>
#include <stdio.h>
#include "board.h"
#include "drv_sdio.h"
#ifdef RT_USING_SDIO
@@ -294,8 +295,8 @@ static rt_err_t sdhci_pl180_setclock(struct sdhci_t * sdhci, rt_uint32_t clock)
if(clock)
{
temp = read32(pdat->virt + PL180_CLOCK) | (0x1<<8);
temp = temp; // skip warning
temp = read32(pdat->virt + PL180_CLOCK) | (0x1 << 8);
(void)temp; // skip warning
write32(pdat->virt + PL180_CLOCK, 0x100);
}
else
@@ -419,7 +420,12 @@ int pl180_init(void)
}
rt_memset(sdhci, 0, sizeof(struct sdhci_t));
#ifdef RT_USING_LWP
virt = (rt_uint32_t)rt_ioremap((void*)MMC_BASE_ADDR, 0x1000);
#else
virt = MMC_BASE_ADDR;
#endif
id = (((read32((virt + 0xfec)) & 0xff) << 24) |
((read32((virt + 0xfe8)) & 0xff) << 16) |
((read32((virt + 0xfe4)) & 0xff) << 8) |

View File

@@ -10,18 +10,23 @@
#include <board.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <automac.h>
#include <netif/ethernetif.h>
#include <lwipopts.h>
#include <automac.h>
#include "delay.h"
#include "mmu.h"
#include "drv_smc911x.h"
#define MAX_ADDR_LEN 6
#define SMC911X_EMAC_DEVICE(eth) (struct eth_device_smc911x*)(eth)
#include "drv_smc911x.h"
#define DRIVERNAME "EMAC"
#define DBG_LVL DBG_LOG
#define DBG_TAG "EMAC"
#include <rtdbg.h>
struct eth_device_smc911x
{
/* inherit from Ethernet device */
@@ -34,6 +39,7 @@ struct eth_device_smc911x
};
static struct eth_device_smc911x _emac;
#if defined (CONFIG_SMC911X_32_BIT)
rt_inline uint32_t smc911x_reg_read(struct eth_device_smc911x *dev, uint32_t offset)
{
@@ -117,7 +123,7 @@ static int smc911x_detect_chip(struct eth_device_smc911x *dev)
}
else if (val != 0x87654321)
{
rt_kprintf(DRIVERNAME ": Invalid chip endian 0x%08lx\n", val);
LOG_E("Invalid chip endian 0x%08lx\n", val);
return -1;
}
@@ -348,21 +354,12 @@ static rt_err_t smc911x_emac_init(rt_device_t dev)
/* Turn on Tx + Rx */
smc911x_enable(emac);
#if 1
/* Interrupt on every received packet */
smc911x_reg_write(emac, LAN9118_FIFO_INT, 0x01 << 8);
smc911x_reg_write(emac, LAN9118_INT_EN, LAN9118_INT_EN_RDFL_EN | LAN9118_INT_RSFL);
/* enable interrupt */
smc911x_reg_write(emac, LAN9118_IRQ_CFG, LAN9118_IRQ_CFG_IRQ_EN | LAN9118_IRQ_CFG_IRQ_POL | LAN9118_IRQ_CFG_IRQ_TYPE);
#else
/* disable interrupt */
smc911x_reg_write(emac, LAN9118_INT_EN, 0);
value = smc911x_reg_read(emac, LAN9118_IRQ_CFG);
value &= ~LAN9118_IRQ_CFG_IRQ_EN;
smc911x_reg_write(emac, LAN9118_IRQ_CFG, value);
#endif
rt_hw_interrupt_install(emac->irqno, smc911x_isr, emac, "smc911x");
rt_hw_interrupt_umask(emac->irqno);
@@ -433,7 +430,7 @@ rt_err_t smc911x_emac_tx(rt_device_t dev, struct pbuf *p)
if (!status) return 0;
rt_kprintf(DRIVERNAME ": failed to send packet: %s%s%s%s%s\n",
LOG_E(DRIVERNAME ": failed to send packet: %s%s%s%s%s\n",
status & LAN9118_TXS_LOC ? "LAN9118_TXS_LOC " : "",
status & LAN9118_TXS_LCOL ? "LAN9118_TXS_LCOL " : "",
status & LAN9118_TXS_ECOL ? "LAN9118_TXS_ECOL " : "",
@@ -501,7 +498,12 @@ const static struct rt_device_ops smc911x_emac_ops =
int smc911x_emac_hw_init(void)
{
rt_memset(&_emac, 0x0, sizeof(_emac));
_emac.iobase = VEXPRESS_ETH_BASE;
#ifdef RT_USING_LWP
_emac.iobase = (uint32_t)rt_ioremap((void*)VEXPRESS_ETH_BASE, 0x1000);
#endif
_emac.irqno = IRQ_VEXPRESS_A9_ETH;
if (smc911x_detect_chip(&_emac))

View File

@@ -12,10 +12,17 @@
#include <rtthread.h>
#include <stdint.h>
#include "mmu.h"
#include "board.h"
#define TIMER01_HW_BASE 0x10011000
#define TIMER23_HW_BASE 0x10012000
#define TIMER01_HW_BASE_PHY 0x10011000
#define TIMER23_HW_BASE_PHY 0x10012000
void* timer01_hw_base;
void* timer23_hw_base;
#define TIMER01_HW_BASE timer01_hw_base
#define TIMER23_HW_BASE timer23_hw_base
#define TIMER_LOAD(hw_base) __REG32(hw_base + 0x00)
#define TIMER_VALUE(hw_base) __REG32(hw_base + 0x04)
@@ -51,8 +58,10 @@
#define TIMER_MIS(hw_base) __REG32(hw_base + 0x14)
#define TIMER_BGLOAD(hw_base) __REG32(hw_base + 0x18)
#define SYS_CTRL __REG32(REALVIEW_SCTL_BASE)
#define TIMER_HW_BASE REALVIEW_TIMER2_3_BASE
void* sys_ctrl;
#define SYS_CTRL __REG32(sys_ctrl)
void* timer_hw_base;
#define TIMER_HW_BASE timer_hw_base
static void rt_hw_timer_isr(int vector, void *param)
{
@@ -65,6 +74,14 @@ int rt_hw_timer_init(void)
{
rt_uint32_t val;
#ifdef RT_USING_LWP
sys_ctrl = (void*)rt_ioremap((void*)REALVIEW_SCTL_BASE, 0x1000);
timer_hw_base = (void*)rt_ioremap((void*)REALVIEW_TIMER2_3_BASE, 0x1000);
#else
sys_ctrl = (void*)REALVIEW_SCTL_BASE;
timer_hw_base = (void*)REALVIEW_TIMER2_3_BASE;
#endif
SYS_CTRL |= REALVIEW_REFCLK;
/* Setup Timer0 for generating irq */
@@ -91,6 +108,11 @@ void timer_init(int timer, unsigned int preload)
if (timer == 0)
{
#ifdef RT_USING_LWP
timer01_hw_base = (void*)rt_ioremap((void*)TIMER01_HW_BASE_PHY, 0x1000);
#else
timer01_hw_base = (void*)TIMER01_HW_BASE_PHY;
#endif
/* Setup Timer0 for generating irq */
val = TIMER_CTRL(TIMER01_HW_BASE);
val &= ~TIMER_CTRL_ENABLE;
@@ -104,6 +126,11 @@ void timer_init(int timer, unsigned int preload)
}
else
{
#ifdef RT_USING_LWP
timer23_hw_base = (void*)rt_ioremap((void*)TIMER23_HW_BASE_PHY, 0x1000);
#else
timer01_hw_base = (void*)TIMER23_HW_BASE_PHY;
#endif
/* Setup Timer1 for generating irq */
val = TIMER_CTRL(TIMER23_HW_BASE);
val &= ~TIMER_CTRL_ENABLE;

View File

@@ -325,7 +325,8 @@ struct rt_hw_register
unsigned long ORIG_r0;
};
#include <armv7.h>
#include <rtdef.h>
#include <cpuport.h>
/* Interrupt Control Interface */
#define ARM_GIC_CPU_BASE 0x1E000000

View File

@@ -0,0 +1,59 @@
#ifndef RT_LCD_H__
#define RT_LCD_H__
/* ioctls
0x46 is 'F' */
#define FBIOGET_VSCREENINFO 0x4600
#define FBIOPUT_VSCREENINFO 0x4601
#define FBIOGET_FSCREENINFO 0x4602
#define FBIOGETCMAP 0x4604
#define FBIOPUTCMAP 0x4605
#define FBIOPAN_DISPLAY 0x4606
#define FBIO_CURSOR 0x4608
/* #define FBIOGET_MONITORSPEC 0x460C */
/* #define FBIOPUT_MONITORSPEC 0x460D */
/* #define FBIOSWITCH_MONIBIT 0x460E */
#define FBIOGET_CON2FBMAP 0x460F
#define FBIOPUT_CON2FBMAP 0x4610
#define FBIOBLANK 0x4611 /* arg: 0 or vesa level + 1 */
#define FBIOGET_VBLANK 0x4612
#define FBIO_ALLOC 0x4613
#define FBIO_FREE 0x4614
#define FBIOGET_GLYPH 0x4615
#define FBIOGET_HWCINFO 0x4616
#define FBIOPUT_MODEINFO 0x4617
#define FBIOGET_DISPINFO 0x4618
#define FBIO_WAITFORVSYNC 0x4620
struct fb_bitfield
{
uint32_t offset; /* beginning of bitfield */
uint32_t length; /* length of bitfield */
uint32_t msb_right; /* != 0 : Most significant bit is */
/* right */
};
struct fb_var_screeninfo
{
uint32_t xres;
uint32_t yres;
uint32_t bits_per_pixel;
struct fb_bitfield red; /* bitfield in fb mem if true color, */
struct fb_bitfield green; /* else only length is significant */
struct fb_bitfield blue;
struct fb_bitfield transp; /* transparency */
};
struct fb_fix_screeninfo
{
char id[16];
unsigned long smem_start;
uint32_t smem_len;
uint32_t line_length;
};
#endif

View File

@@ -19,6 +19,10 @@
#ifdef RT_USING_SMP
#include <interrupt.h>
#ifdef RT_USING_USERSPACE
#include <mmu.h>
#endif
static void rt_hw_timer2_isr(int vector, void *param)
{
rt_tick_increase();
@@ -26,28 +30,34 @@ static void rt_hw_timer2_isr(int vector, void *param)
timer_clear_pending(0);
}
void set_secondary_cpu_boot_address(void)
{
extern void secondary_cpu_start(void);
uint32_t *boot_address = (uint32_t *)0x10000030;
*(boot_address + 1) = ~0ul;
*boot_address = (uint32_t )&secondary_cpu_start;
}
void rt_hw_secondary_cpu_up(void)
{
set_secondary_cpu_boot_address();
__asm__ volatile ("dsb":::"memory");
volatile void **plat_boot_reg = (volatile void **)0x10000034;
char *entry = (char *)rt_secondary_cpu_entry;
#ifdef RT_USING_USERSPACE
plat_boot_reg = (volatile void **)rt_hw_mmu_map(&mmu_info, 0, (void *)plat_boot_reg, 0x1000, MMU_MAP_K_RW);
if (!plat_boot_reg)
{
/* failed */
return;
}
entry += PV_OFFSET;
#endif
*plat_boot_reg-- = (void *)(size_t)-1;
*plat_boot_reg = (void *)entry;
rt_hw_dsb();
rt_hw_ipi_send(0, 1 << 1);
}
void secondary_cpu_c_start(void)
/* Interface */
void rt_hw_secondary_cpu_bsp_start(void)
{
rt_hw_vector_init();
rt_hw_spin_lock(&_cpus_lock);
arm_gic_cpu_init(0, REALVIEW_GIC_CPU_BASE);
arm_gic_cpu_init(0, 0);
arm_gic_set_cpu(0, IRQ_PBA8_TIMER0_1, 0x2);
timer_init(0, 10000);

View File

@@ -12,6 +12,8 @@
#include <rtdevice.h>
#include "serial.h"
#include "board.h"
#include "mmu.h"
struct hw_uart_device
{
@@ -132,6 +134,9 @@ int rt_hw_uart_init(void)
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
#ifdef RT_USING_UART0
#ifdef RT_USING_LWP
_uart0_device.hw_base = (uint32_t)rt_ioremap((void*)_uart0_device.hw_base, 0x1000);
#endif
uart = &_uart0_device;
_serial0.ops = &_uart_ops;
@@ -147,6 +152,9 @@ int rt_hw_uart_init(void)
#endif
#ifdef RT_USING_UART1
#ifdef RT_USING_LWP
_uart1_device.hw_base = (uint32_t)rt_ioremap((void*)_uart1_device.hw_base, 0x1000);
#endif
uart = &_uart1_device;
_serial1.ops = &_uart_ops;
_serial1.config = config;

View File

@@ -0,0 +1,111 @@
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
SECTIONS
{
/*. = 0x60010000; */
. = 0xc0010000;
__text_start = .;
.text :
{
*(.vectors)
*(.text)
*(.text.*)
/* section information for utest */
. = ALIGN(4);
__rt_utest_tc_tab_start = .;
KEEP(*(UtestTcTab))
__rt_utest_tc_tab_end = .;
/* section information for finsh shell */
. = ALIGN(4);
__fsymtab_start = .;
KEEP(*(FSymTab))
__fsymtab_end = .;
. = ALIGN(4);
__vsymtab_start = .;
KEEP(*(VSymTab))
__vsymtab_end = .;
/* section information for var export */
. = ALIGN(4);
__ve_table_start = .;
KEEP(*(SORT(*.VarExpTab.*)))
__ve_table_end = .;
/* section information for modules */
. = ALIGN(4);
__rtmsymtab_start = .;
KEEP(*(RTMSymTab))
__rtmsymtab_end = .;
/* section information for initialization */
. = ALIGN(4);
__rt_init_start = .;
KEEP(*(SORT(.rti_fn*)))
__rt_init_end = .;
} =0
__text_end = .;
.ARM.exidx :
{
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
}
__rodata_start = .;
.rodata : { *(.rodata) *(.rodata.*) }
__rodata_end = .;
. = ALIGN(4);
.ctors :
{
PROVIDE(__ctors_start__ = .);
/* new GCC version uses .init_array */
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE(__ctors_end__ = .);
}
.dtors :
{
PROVIDE(__dtors_start__ = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE(__dtors_end__ = .);
}
. = ALIGN(8);
__data_start = .;
.data :
{
*(.data)
*(.data.*)
}
__data_end = .;
. = ALIGN(4);
__bss_start = .;
.bss :
{
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
}
. = ALIGN(4);
__bss_end = .;
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
_end = .;
}

View File

@@ -47,9 +47,12 @@ SECTIONS
} =0
__text_end = .;
__exidx_start = .;
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
__exidx_end = .;
.ARM.exidx :
{
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
}
__rodata_start = .;
.rodata : { *(.rodata) *(.rodata.*) }
@@ -68,8 +71,8 @@ SECTIONS
.dtors :
{
PROVIDE(__dtors_start__ = .);
KEEP(*(SORT(.dtors.*)))
KEEP(*(.dtors))
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE(__dtors_end__ = .);
}
@@ -82,7 +85,7 @@ SECTIONS
}
__data_end = .;
. = ALIGN(8);
. = ALIGN(4);
__bss_start = .;
.bss :
{

View File

@@ -3,4 +3,4 @@ if exist sd.bin goto run
qemu-img create -f raw sd.bin 64M
:run
qemu-system-arm -M vexpress-a9 -kernel rtthread.elf -serial stdio -sd sd.bin -S -s
qemu-system-arm -M vexpress-a9 -kernel rtthread.bin -serial stdio -sd sd.bin -S -s

View File

@@ -7,19 +7,16 @@
/* RT-Thread Kernel */
#define RT_NAME_MAX 8
#define RT_USING_SMP
#define RT_CPUS_NR 2
#define RT_ALIGN_SIZE 4
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
#define RT_THREAD_PRIORITY_256
#define RT_THREAD_PRIORITY_MAX 256
#define RT_TICK_PER_SECOND 100
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
#define RT_HOOK_USING_FUNC_PTR
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 1024
#define SYSTEM_THREAD_STACK_SIZE 1024
#define IDLE_THREAD_STACK_SIZE 4096
#define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 1024
@@ -36,13 +33,11 @@
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
#define RT_USING_SIGNALS
/* Memory Management */
#define RT_USING_MEMPOOL
#define RT_USING_SMALL_MEM
#define RT_USING_SLAB
#define RT_USING_MEMHEAP
#define RT_MEMHEAP_FAST_MODE
#define RT_USING_SMALL_MEM_AS_HEAP
@@ -57,9 +52,12 @@
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 256
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_VER_NUM 0x40101
#define ARCH_ARM
#define RT_VER_NUM 0x50000
#define RT_USING_CACHE
#define RT_USING_CPU_FFS
#define ARCH_MM_MMU
#define ARCH_ARM
#define ARCH_ARM_MMU
#define ARCH_ARM_CORTEX_A
#define RT_USING_GIC_V2
#define ARCH_ARM_CORTEX_A9
@@ -77,16 +75,16 @@
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_USING_HISTORY
#define FINSH_HISTORY_LINES 5
#define FINSH_HISTORY_LINES 10
#define FINSH_USING_SYMTAB
#define FINSH_CMD_SIZE 80
#define FINSH_CMD_SIZE 256
#define MSH_USING_BUILT_IN_COMMANDS
#define FINSH_USING_DESCRIPTION
#define FINSH_ARG_MAX 10
#define RT_USING_DFS
#define DFS_USING_POSIX
#define DFS_USING_WORKDIR
#define DFS_FILESYSTEMS_MAX 4
#define DFS_FILESYSTEMS_MAX 8
#define DFS_FILESYSTEM_TYPES_MAX 8
#define DFS_FD_MAX 32
#define RT_USING_DFS_ELMFAT
@@ -106,22 +104,24 @@
#define RT_DFS_ELM_MUTEX_TIMEOUT 3000
#define RT_USING_DFS_DEVFS
#define RT_USING_DFS_ROMFS
#define RT_USING_DFS_RAMFS
#define RT_USING_LWP
#define RT_USING_DFS_TMPFS
/* Device Drivers */
#define RT_USING_DEVICE_IPC
#define RT_UNAMED_PIPE_NUMBER 64
#define RT_USING_SYSTEM_WORKQUEUE
#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048
#define RT_SYSTEM_WORKQUEUE_PRIORITY 23
#define RT_USING_SERIAL
#define RT_USING_SERIAL_V1
#define RT_SERIAL_USING_DMA
#define RT_SERIAL_RB_BUFSZ 64
#define RT_SERIAL_RB_BUFSZ 256
#define RT_USING_I2C
#define RT_USING_I2C_BITOPS
#define RT_USING_PIN
#define RT_USING_NULL
#define RT_USING_ZERO
#define RT_USING_RANDOM
#define RT_USING_MTD_NOR
#define RT_USING_MTD_NAND
#define RT_MTD_NAND_DEBUG
@@ -140,6 +140,7 @@
#define RT_SFUD_USING_FLASH_INFO_TABLE
#define RT_SFUD_SPI_MAX_HZ 50000000
#define RT_USING_WDT
#define RT_USING_DEV_BUS
/* Using USB */
@@ -155,81 +156,24 @@
#define RT_USING_POSIX_STDIO
#define RT_USING_POSIX_POLL
#define RT_USING_POSIX_SELECT
#define RT_USING_POSIX_SOCKET
#define RT_USING_POSIX_TERMIOS
#define RT_USING_POSIX_AIO
#define RT_USING_POSIX_DELAY
#define RT_USING_POSIX_CLOCK
#define RT_USING_PTHREADS
#define PTHREAD_NUM_MAX 8
#define RT_USING_POSIX_TIMER
/* Interprocess Communication (IPC) */
#define RT_USING_POSIX_PIPE
#define RT_USING_POSIX_PIPE_SIZE 512
#define RT_USING_POSIX_MESSAGE_QUEUE
#define RT_USING_POSIX_MESSAGE_SEMAPHORE
/* Socket is in the 'Network' category */
#define RT_USING_CPLUSPLUS
/* Network */
#define RT_USING_SAL
#define SAL_INTERNET_CHECK
/* Docking with protocol stacks */
#define SAL_USING_LWIP
#define SAL_USING_POSIX
#define RT_USING_NETDEV
#define NETDEV_USING_IFCONFIG
#define NETDEV_USING_PING
#define NETDEV_USING_NETSTAT
#define NETDEV_USING_AUTO_DEFAULT
#define NETDEV_IPV4 1
#define NETDEV_IPV6 0
#define RT_USING_LWIP
#define RT_USING_LWIP203
#define RT_USING_LWIP_VER_NUM 0x20003
#define RT_LWIP_MEM_ALIGNMENT 4
#define RT_LWIP_ICMP
#define RT_LWIP_DNS
#define RT_LWIP_DHCP
#define IP_SOF_BROADCAST 1
#define IP_SOF_BROADCAST_RECV 1
/* Static IPv4 Address */
#define RT_LWIP_IPADDR "192.168.1.30"
#define RT_LWIP_GWADDR "192.168.1.1"
#define RT_LWIP_MSKADDR "255.255.255.0"
#define RT_LWIP_UDP
#define RT_LWIP_TCP
#define RT_LWIP_RAW
#define RT_MEMP_NUM_NETCONN 8
#define RT_LWIP_PBUF_NUM 16
#define RT_LWIP_RAW_PCB_NUM 4
#define RT_LWIP_UDP_PCB_NUM 4
#define RT_LWIP_TCP_PCB_NUM 4
#define RT_LWIP_TCP_SEG_NUM 40
#define RT_LWIP_TCP_SND_BUF 8196
#define RT_LWIP_TCP_WND 8196
#define RT_LWIP_TCPTHREAD_PRIORITY 10
#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8
#define RT_LWIP_TCPTHREAD_STACKSIZE 1024
#define RT_LWIP_ETHTHREAD_PRIORITY 12
#define RT_LWIP_ETHTHREAD_STACKSIZE 1024
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8
#define RT_LWIP_REASSEMBLY_FRAG
#define LWIP_NETIF_STATUS_CALLBACK 1
#define LWIP_NETIF_LINK_CALLBACK 1
#define SO_REUSE 1
#define LWIP_SO_RCVTIMEO 1
#define LWIP_SO_SNDTIMEO 1
#define LWIP_SO_RCVBUF 1
#define LWIP_SO_LINGER 0
#define LWIP_NETIF_LOOPBACK 0
#define RT_LWIP_USING_PING
/* Utilities */
@@ -294,6 +238,11 @@
/* peripheral libraries and drivers */
/* sensors drivers */
/* touch drivers */
/* Kendryte SDK */
@@ -301,6 +250,9 @@
/* AI packages */
/* Signal Processing and Control Algorithm Packages */
/* miscellaneous packages */
/* project laboratory */
@@ -311,6 +263,39 @@
/* entertainment: terminal games and other interesting software packages */
/* Arduino libraries */
/* Projects */
/* Sensors */
/* Display */
/* Timing */
/* Data Processing */
/* Data Storage */
/* Communication */
/* Device Control */
/* Other */
/* Signal IO */
/* Uncategorized */
/* Privated Packages of RealThread */
@@ -328,6 +313,5 @@
#define RT_USING_UART0
#define RT_USING_UART1
#define BSP_DRV_EMAC
#endif

View File

@@ -33,6 +33,9 @@ PLATFORM = 'gcc'
EXEC_PATH = os.getenv('RTT_EXEC_PATH') or r'/usr/bin'
BUILD = 'debug'
# LINK_SCRIPT = 'link-lwp.lds'
LINK_SCRIPT = 'link.lds'
if PLATFORM == 'gcc':
# toolchains
PREFIX = os.getenv('RTT_CC_PREFIX') or 'arm-none-eabi-'
@@ -52,8 +55,8 @@ if PLATFORM == 'gcc':
CXXFLAGS= DEVICE + CFPFLAGS + ' -Wall'
CFLAGS = DEVICE + CFPFLAGS + ' -Wall -std=gnu99'
AFLAGS = DEVICE + ' -c' + AFPFLAGS + ' -x assembler-with-cpp'
LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T link.lds' + ' -lsupc++ -lgcc -static'
AFLAGS = DEVICE + ' -c' + AFPFLAGS + ' -x assembler-with-cpp'
LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors -T '+ LINK_SCRIPT + ' -lsupc++ -lgcc -static'
CPATH = ''
LPATH = ''