TRIMUI SMART
build xboot
參考資訊:
1. xboot
sys-uart.c
/* * sys-uart.c * * Copyright(c) 2007-2023 Jianjun Jiang <8192542@qq.com> * Official site: http://xboot.org * Mobile phone: +86-18665388956 * QQ: 8192542 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include <xboot.h> void sys_uart_init(void) { virtual_addr_t addr; u32_t val; /* Config GPIOB0 and GPIOB1 to txd2 and rxd2 */ addr = 0x01c20824; val = read32(addr); val &= ~0xff; val |= 0x22; write32(addr, val); /* Open the clock gate for uart0 */ addr = 0x01c2006c; val = read32(addr); val |= 1 << 18; write32(addr, val); /* Deassert uart0 reset */ addr = 0x01c202d8; val = read32(addr); val |= 1 << 18; write32(addr, val); /* Config uart0 to 115200-8-1-0 */ addr = 0x01c28800; 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); } void sys_uart_putc(char c) { virtual_addr_t addr = 0x01c28800; while((read32(addr + 0x7c) & (0x1 << 1)) == 0); write32(addr + 0x00, c); }
src/arch/arm32/mach-s3/xiaozhi.c
/* * xiaozhi.c * * Copyright(c) 2007-2023 Jianjun Jiang <8192542@qq.com> * Official site: http://xboot.org * Mobile phone: +86-18665388956 * QQ: 8192542 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include <xboot.h> static u32_t sram_read_id(virtual_addr_t virt) { u32_t id; write32(virt, read32(virt) | (1 << 15)); id = read32(virt) >> 16; write32(virt, read32(virt) & ~(1 << 15)); return id; } static int mach_detect(struct machine_t * mach) { u32_t id = sram_read_id(phys_to_virt(0x01c00024)); if(id == 0x1681) return 1; return 0; } static void mach_smpinit(struct machine_t * mach) { } static void mach_smpboot(struct machine_t * mach, void (*func)(void)) { } static void mach_shutdown(struct machine_t * mach) { } static void mach_reboot(struct machine_t * mach) { } static void mach_sleep(struct machine_t * mach) { } static void mach_cleanup(struct machine_t * mach) { } static void mach_logger(struct machine_t * mach, const char * buf, int count) { virtual_addr_t virt = phys_to_virt(0x01c28800); int i; for(i = 0; i < count; i++) { while((read32(virt + 0x14) & (0x1 << 6)) == 0); write32(virt + 0x00, buf[i]); } } static const char * mach_uniqueid(struct machine_t * mach) { static char uniqueid[32 + 1] = { 0 }; virtual_addr_t virt = phys_to_virt(0x01c23800); uint32_t sid[4]; sid[0] = read32(virt + 0 * 4); sid[1] = read32(virt + 1 * 4); sid[2] = read32(virt + 2 * 4); sid[3] = read32(virt + 3 * 4); snprintf(uniqueid, sizeof(uniqueid), "%08x%08x%08x%08x",sid[0], sid[1], sid[2], sid[3]); return uniqueid; } static int mach_keygen(struct machine_t * mach, const char * msg, void * key) { return 0; } static int mach_verify(struct machine_t * mach) { return 1; } static struct machine_t xiaozhi = { .name = "xiaozhi", .desc = "XiaoZhi Based On Allwinner S3 SOC", .detect = mach_detect, .smpinit = mach_smpinit, .smpboot = mach_smpboot, .shutdown = mach_shutdown, .reboot = mach_reboot, .sleep = mach_sleep, .cleanup = mach_cleanup, .logger = mach_logger, .uniqueid = mach_uniqueid, .keygen = mach_keygen, .verify = mach_verify, }; static __init void xiaozhi_machine_init(void) { register_machine(&xiaozhi); } static __exit void xiaozhi_machine_exit(void) { unregister_machine(&xiaozhi); } machine_initcall(xiaozhi_machine_init); machine_exitcall(xiaozhi_machine_exit);
編譯、下載
$ cd $ git clone https://github.com/xboot/xboot $ cd xboot $ vim src/Makefile 341 #@echo [SZ] Listing $@ 342 #@$(SZ) -G $@ $ make CROSS_COMPILE=arm-linux-gnueabihf- PLATFORM=arm32-s3 $ xfel ddr s3 $ xfel write 0x40000000 output/xboot.bin $ xfel exec 0x40000000
UART2 (115200 bps)
_ _ _ _ | |___ _____ _____ _| |_ \ \/ /| _ | _ | _ |_ _| (C) 2007-2023 ) ( | |_| | |_| | |_| | | |____JIANJUN.JIANG__ /_/\_\|_____|_____|_____| |_____________________| V3.0.0 (Jun 2 2023 - 23:25:05) - [xiaozhi][XiaoZhi Based On Allwinner S3 SOC] [ 0.000020]Probe device 'blk-romdisk.0' with blk-romdisk [ 0.000800]Probe device 'osc24m' with clk-fixed [ 0.000810]Probe device 'osc32k' with clk-fixed [ 0.000820]Probe device 'iosc' with clk-fixed [ 0.000830]Probe device 'pll-cpu' with clk-s3-pll [ 0.000840]Probe device 'pll-audio' with clk-s3-pll [ 0.000850]Probe device 'pll-video' with clk-s3-pll [ 0.000860]Probe device 'pll-ve' with clk-s3-pll [ 0.000870]Probe device 'pll-ddr0' with clk-s3-pll [ 0.000880]Probe device 'pll-periph0' with clk-s3-pll [ 0.000890]Probe device 'pll-isp' with clk-s3-pll [ 0.000900]Probe device 'pll-periph1' with clk-s3-pll [ 0.000910]Probe device 'pll-ddr1' with clk-s3-pll [ 0.000920]Probe device 'osc24m-750' with clk-fixed-factor [ 0.000930]Probe device 'pll-periph0-2' with clk-fixed-factor [ 0.000940]Probe device 'losc' with clk-fixed-factor [ 0.000950]Probe device 'cpu' with clk-mux [ 0.000960]Probe device 'axi' with clk-divider [ 0.000970]Probe device 'ahb1-pre-div' with clk-divider [ 0.000980]Probe device 'mux-ahb1' with clk-mux [ 0.000990]Probe device 'ahb1' with clk-ratio [ 0.001000]Probe device 'apb1' with clk-ratio [ 0.001010]Probe device 'mux-apb2' with clk-mux [ 0.001020]Probe device 'ratio-apb2' with clk-ratio [ 0.001030]Probe device 'apb2' with clk-divider [ 0.001040]Probe device 'ahb2' with clk-mux [ 0.001050]Probe device 'gate-bus-uart0' with clk-gate [ 0.001060]Probe device 'gate-bus-uart1' with clk-gate [ 0.001070]Probe device 'gate-bus-uart2' with clk-gate [ 0.001080]Probe device 'link-uart0' with clk-link [ 0.001090]Probe device 'link-uart1' with clk-link [ 0.001100]Probe device 'link-uart2' with clk-link [ 0.001110]Probe device 'gate-bus-i2c0' with clk-gate [ 0.001120]Probe device 'gate-bus-i2c1' with clk-gate [ 0.001130]Probe device 'link-i2c0' with clk-link [ 0.001140]Probe device 'link-i2c1' with clk-link [ 0.001150]Probe device 'gate-bus-usbphy0' with clk-gate [ 0.001160]Probe device 'gate-bus-usb-otg-device' with clk-gate [ 0.001170]Probe device 'gate-bus-usb-otg-ehci0' with clk-gate [ 0.001180]Probe device 'gate-bus-usb-otg-ohci0' with clk-gate [ 0.001190]Probe device 'gate-usb-otg-ohci0' with clk-gate [ 0.001200]Probe device 'link-usb-otg-device' with clk-link [ 0.001210]Probe device 'link-usb-otg-ehci0' with clk-link [ 0.001220]Probe device 'link-usb-otg-ohci0' with clk-link [ 0.001230]Probe device 'gate-bus-hstimer' with clk-gate [ 0.001240]Probe device 'link-hstimer' with clk-link [ 0.001250]Probe device 'gate-bus-ephy' with clk-gate [ 0.001260]Probe device 'gate-bus-emac' with clk-gate [ 0.001270]Probe device 'link-emac' with clk-link [ 0.001280]Probe device 'mux-spi0' with clk-mux [ 0.001290]Probe device 'ratio-spi0' with clk-ratio [ 0.001300]Probe device 'div-spi0' with clk-divider [ 0.001310]Probe device 'gate-spi0' with clk-gate [ 0.001320]Probe device 'gate-bus-spi0' with clk-gate [ 0.001330]Probe device 'link-spi0' with clk-link [ 0.001340]Probe device 'mux-timer0' with clk-mux [ 0.001350]Probe device 'ratio-timer0' with clk-ratio [ 0.001360]Probe device 'link-timer0' with clk-link [ 0.001370]Probe device 'mux-timer1' with clk-mux [ 0.001380]Probe device 'ratio-timer1' with clk-ratio [ 0.001390]Probe device 'link-timer1' with clk-link [ 0.001400]Probe device 'mux-timer2' with clk-mux [ 0.001410]Probe device 'ratio-timer2' with clk-ratio [ 0.001420]Probe device 'link-timer2' with clk-link [ 0.001430]Probe device 'link-pwm' with clk-link [ 0.001440]Probe device 'link-wdt' with clk-link [ 0.001450]Probe device 'mux-de' with clk-mux [ 0.001460]Probe device 'div-de' with clk-divider [ 0.001470]Probe device 'gate-de' with clk-gate [ 0.001480]Probe device 'gate-bus-de' with clk-gate [ 0.001490]Probe device 'link-de' with clk-link [ 0.001500]Probe device 'mux-tcon' with clk-mux [ 0.001510]Probe device 'div-tcon' with clk-divider [ 0.001520]Probe device 'gate-tcon' with clk-gate [ 0.001530]Probe device 'gate-bus-tcon' with clk-gate [ 0.001540]Probe device 'link-tcon' with clk-link [ 0.001550]Probe device 'mux-sdmmc0' with clk-mux [ 0.001560]Probe device 'ratio-sdmmc0' with clk-ratio [ 0.001570]Probe device 'div-sdmmc0' with clk-divider [ 0.001580]Probe device 'gate-sdmmc0' with clk-gate [ 0.001590]Probe device 'gate-bus-sdmmc0' with clk-gate [ 0.001600]Probe device 'link-sdmmc0' with clk-link [ 0.001610]Probe device 'mux-sdmmc1' with clk-mux [ 0.001620]Probe device 'ratio-sdmmc1' with clk-ratio [ 0.001630]Probe device 'div-sdmmc1' with clk-divider [ 0.001640]Probe device 'gate-sdmmc1' with clk-gate [ 0.001650]Probe device 'gate-bus-sdmmc1' with clk-gate [ 0.001660]Probe device 'link-sdmmc1' with clk-link [ 0.001670]Probe device 'mux-sdmmc2' with clk-mux [ 0.001680]Probe device 'ratio-sdmmc2' with clk-ratio [ 0.001690]Probe device 'div-sdmmc2' with clk-divider [ 0.001700]Probe device 'gate-sdmmc2' with clk-gate [ 0.001710]Probe device 'gate-bus-sdmmc2' with clk-gate [ 0.001720]Probe device 'link-sdmmc2' with clk-link [ 0.001730]Probe device 'reset-s3.0' with reset-s3 [ 0.001740]Probe device 'reset-s3.1' with reset-s3 [ 0.001750]Probe device 'reset-s3.2' with reset-s3 [ 0.001760]Probe device 'reset-s3.3' with reset-s3 [ 0.001770]Probe device 'reset-s3.4' with reset-s3 [ 0.001780]Probe device 'irq-gic400.0' with irq-gic400 [ 0.001790]Probe device 'irq-s3-gpio.0' with irq-s3-gpio [ 0.001800]Probe device 'irq-s3-gpio.1' with irq-s3-gpio [ 0.001810]Probe device 'gpio-s3.0' with gpio-s3 [ 0.001820]Probe device 'gpio-s3.1' with gpio-s3 [ 0.001830]Probe device 'gpio-s3.2' with gpio-s3 [ 0.001840]Probe device 'gpio-s3.3' with gpio-s3 [ 0.001850]Probe device 'gpio-s3.4' with gpio-s3 [ 0.001860]Probe device 'gpio-s3.5' with gpio-s3 [ 0.001870]Probe device 'pwm-s3.0' with pwm-s3 [ 0.001880]Probe device 'pwm-s3.1' with pwm-s3 [ 0.001890]Probe device 'ce-s3-timer.0' with ce-s3-timer [ 0.000024]Probe device 'cs-s3-timer.0' with cs-s3-timer [ 0.005319]Probe device 'uart-16550.0' with uart-16550 [ 0.010417]Probe device 'uart-16550.1' with uart-16550 [ 0.015530]Probe device 'uart-16550.2' with uart-16550 [ 0.020733]Probe device 'i2c-s3.0' with i2c-s3 [ 0.025145]Probe device 'i2c-s3.1' with i2c-s3 [ 0.029566]Probe device 'spi-s3.0' with spi-s3 [ 0.038308]SD/MMC card at the 'sdhci-s3.0' host controller: [ 0.043787] Attached is a SD card [ 0.047168] Version: 2.0 [ 0.049780] Capacity: 29.760GB [ 0.052887] High capacity card [ 0.056006] CID: 1D414455-53440000-10000170-9F016BE9 [ 0.061033] CSD: 400E0032-5B590000-EE137F80-0A40004D [ 0.066059] Max transfer speed: 25000000 HZ [ 0.070306] Manufacturer ID: 1D [ 0.073513] OEM/Application ID: 4144 [ 0.077153] Product name: 'USD' [ 0.080533] Product revision: 1.0 [ 0.083913] Serial no: 327122954 [ 0.087206] Manufacturing date: 2022.11 [ 0.092792]Found mbr partition: [ 0.095846] 0x0000000000000000 ~ 0x00000007709fffff 29.760GB - sdhci-s3.0.sdcard [ 0.103400] 0x0000000000400000 ~ 0x00000000343fffff 832.000MB - sdhci-s3.0.sdcard.p0 [ 0.111184]Probe device 'sdhci-s3.0' with sdhci-s3 [ 0.115989]Fail to probe device with blk-spinor [ 0.120477]Probe device 'wdg-s3.0' with wdg-s3 [ 0.124902]Probe device 'key-s3-lradc.0' with key-s3-lradc [ 0.130889]Probe device 'led-pwm.0' with led-pwm [ 0.135433]Probe device 'buzzer-pwm.0' with buzzer-pwm [ 0.142883]Probe device 'fb-s3.0' with fb-s3 [ 0.147074]Probe device 'console-uart.0' with console-uart [ 0.153078]mount /private with 'ram' filesystem