allwinner boot0启动
目录
路径:u-boot-2018/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
路径:u-boot-2018/arch/arm/cpu/armv7/start.S
路径:u-boot-2018/arch/arm/lib/crt0.S
路径:u-boot-2014.07\\common\\board_f.c
路径:u-boot-2014.07\\common\\board_r.c
U_BOOT_CMD(烧写函数)
Uboot用户自定义程序(未找到被调用的位置)
SUNXI_USB
结构体申明
结构体定义
dram_data_recv_finish
Uboot中添加环境变量
路径:u-boot-2018/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds
/* SPDX-License-Identifier: GPL-2.0+ */
/ (C) Copyright 2012* Allwinner Technology Co., Ltd. <www.allwinnertech.com>* Tom Cubie <tangliang@allwinnertech.com> Based on omap-common/u-boot-spl.lds: (C) Copyright 2002* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> (C) Copyright 2010* Texas Instruments, <www.ti.com>* Aneesh V <aneesh@ti.com>*/
MEMORY { .sram : ORIGIN = CONFIG_SPL_TEXT_BASE,\\LENGTH = CONFIG_SPL_MAX_SIZE }
MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR, \\LENGTH = CONFIG_SPL_BSS_MAX_SIZE }OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{.text :{__start = .;*(.vectors)arch/arm/cpu/armv7/start.o (.text)*(.text*)} > .sram. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) } >.sram. = ALIGN(4);.data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram. = ALIGN(4);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));} > .sram. = ALIGN(4);__image_copy_end = .;_end = .;.bss :{. = ALIGN(4);__bss_start = .;*(.bss*). = ALIGN(4);__bss_end = .;} > .sdram
}
ENTRY(_start)表示入口函数,即uboot上电启动的位置。
arch/arm/cpu/armv7/start.o (.text):表示文本段被调用的文件
路径:u-boot-2018/arch/arm/cpu/armv7/start.S
/* SPDX-License-Identifier: GPL-2.0+ */
/ armboot - Startup Code for OMAP3530/ARM Cortex CPU-core Copyright (c) 2004 Texas Instruments <r-woodruff2@ti.com> Copyright (c) 2001 Marius Gr枚ger <mag@sysgo.de>* Copyright (c) 2002 Alex Z眉pke <azu@sysgo.de>* Copyright (c) 2002 Gary Jennejohn <garyj@denx.de>* Copyright (c) 2003 Richard Woodruff <r-woodruff2@ti.com>* Copyright (c) 2003 Kshitij <kshitij@ti.com>* Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com>*/#include <asm-offsets.h>
#include <config.h>
#include <asm/system.h>
#include <linux/linkage.h>
#include <asm/armv7.h>/* Startup Code (reset vector) Do important init only if we don't start from memory!* Setup memory and board specific bits prior to relocation.* Relocate armboot to ram. Setup stack./.globl reset.globl save_boot_params_ret.type save_boot_params_ret,%function
#ifdef CONFIG_ARMV7_LPAE.global switch_to_hypervisor_ret
#endifreset:/* Allow the board to save important registers */b save_boot_params
save_boot_params_ret:
#ifdef CONFIG_ARMV7_LPAE
/ check for Hypervisor support*/mrc p15, 0, r0, c0, c1, 1 @ read ID_PFR1and r0, r0, #CPUID_ARM_VIRT_MASK @ mask virtualization bitscmp r0, #(1 << CPUID_ARM_VIRT_SHIFT)beq switch_to_hypervisor
switch_to_hypervisor_ret:
#endif/ disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,* except if in HYP mode already*/mrs r0, cpsrand r1, r0, #0x1f @ mask mode bitsteq r1, #0x1a @ test for HYP modebicne r0, r0, #0x1f @ clear all mode bitsorrne r0, r0, #0x13 @ set SVC modeorr r0, r0, #0xc0 @ disable FIQ and IRQmsr cpsr,r0/ Setup vector:* (OMAP4 spl TEXT_BASE is not 32 byte aligned.* Continue to use ROM code vector only in OMAP4 spl)*/
#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTLR Registerbic r0, #CR_V @ V = 0mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTLR Register#ifdef CONFIG_HAS_VBAR/* Set vector address in CP15 VBAR register */ldr r0, =_startmcr p15, 0, r0, c12, c0, 0 @Set VBAR
#endif
#endif/* the mask ROM code should have PLL and others stable */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
#ifdef CONFIG_CPU_V7Abl cpu_init_cp15
#endif
#ifndef CONFIG_SKIP_LOWLEVEL_INIT_ONLYbl cpu_init_crit
#endif
#endifbl _main/*------------------------------------------------------------------------------*/ENTRY(c_runtime_cpu_setup)
/ If I-cache is enabled invalidate it*/
#if !CONFIG_IS_ENABLED(SYS_ICACHE_OFF)mcr p15, 0, r0, c7, c5, 0 @ invalidate icachemcr p15, 0, r0, c7, c10, 4 @ DSBmcr p15, 0, r0, c7, c5, 4 @ ISB
#endifbx lrENDPROC(c_runtime_cpu_setup)/* void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3)* __attribute__((weak)); Stack pointer is not yet initialized at this moment* Don't save anything to stack even if compiled with -O0/
ENTRY(save_boot_params)b save_boot_params_ret @ back to my caller
ENDPROC(save_boot_params).weak save_boot_params#ifdef CONFIG_ARMV7_LPAE
ENTRY(switch_to_hypervisor)b switch_to_hypervisor_ret
ENDPROC(switch_to_hypervisor).weak switch_to_hypervisor
#endif/* cpu_init_cp15 Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless* CONFIG_SYS_ICACHE_OFF is defined./
ENTRY(cpu_init_cp15)/ Invalidate L1 I/D*/mov r0, #0 @ set up for MCRmcr p15, 0, r0, c8, c7, 0 @ invalidate TLBsmcr p15, 0, r0, c7, c5, 0 @ invalidate icachemcr p15, 0, r0, c7, c5, 6 @ invalidate BP arraymcr p15, 0, r0, c7, c10, 4 @ DSBmcr p15, 0, r0, c7, c5, 4 @ ISB/ disable MMU stuff and caches*/mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002000 @ clear bits 13 (--V-)bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)orr r0, r0, #0x00000002 @ set bit 1 (--A-) Alignorr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
#if CONFIG_IS_ENABLED(SYS_ICACHE_OFF)bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache
#elseorr r0, r0, #0x00001000 @ set bit 12 (I) I-cache
#endifmcr p15, 0, r0, c1, c0, 0#ifdef SUNXI_ARM_A53/clear AFE,TRE bit in sctrl*non-secure: reset value is unknow*secure : default value is 0*notice : we must set the TRE bit to enable the memory* arttribute configuration from the section table.*/MRC p15, 0, r0, c1, c0, 0 @Read SCTLRBIC r0, r0, #(1<<28) @clr TRE bitBIC r0, r0, #(1<<29) @clr AEF bitMCR p15, 0, r0, c1, c0, 0 @Write SCTLR
#endif#ifdef CONFIG_ARM_ERRATA_716044mrc p15, 0, r0, c1, c0, 0 @ read system control registerorr r0, r0, #1 << 11 @ set bit #11mcr p15, 0, r0, c1, c0, 0 @ write system control register
#endif#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072))mrc p15, 0, r0, c15, c0, 1 @ read diagnostic registerorr r0, r0, #1 << 4 @ set bit #4mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
#endif#ifdef CONFIG_ARM_ERRATA_743622mrc p15, 0, r0, c15, c0, 1 @ read diagnostic registerorr r0, r0, #1 << 6 @ set bit #6mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
#endif#ifdef CONFIG_ARM_ERRATA_751472mrc p15, 0, r0, c15, c0, 1 @ read diagnostic registerorr r0, r0, #1 << 11 @ set bit #11mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
#endif
#ifdef CONFIG_ARM_ERRATA_761320mrc p15, 0, r0, c15, c0, 1 @ read diagnostic registerorr r0, r0, #1 << 21 @ set bit #21mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
#endif#ifdef CONFIG_ARM_ERRATA_845369mrc p15, 0, r0, c15, c0, 1 @ read diagnostic registerorr r0, r0, #1 << 22 @ set bit #22mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
#endifmov r5, lr @ Store my Callermrc p15, 0, r1, c0, c0, 0 @ r1 has Read Main ID Register (MIDR)mov r3, r1, lsr #20 @ get variant fieldand r3, r3, #0xf @ r3 has CPU variantand r4, r1, #0xf @ r4 has CPU revisionmov r2, r3, lsl #4 @ shift variant field for combined valueorr r2, r4, r2 @ r2 has combined CPU variant + revision#ifdef CONFIG_ARM_ERRATA_798870cmp r2, #0x30 @ Applies to lower than R3p0bge skip_errata_798870 @ skip if not affected revcmp r2, #0x20 @ Applies to including and above R2p0blt skip_errata_798870 @ skip if not affected revmrc p15, 1, r0, c15, c0, 0 @ read l2 aux ctrl regorr r0, r0, #1 << 7 @ Enable hazard-detect timeoutpush {r1-r5} @ Save the cpu info registersbl v7_arch_cp15_set_l2aux_ctrlisb @ Recommended ISB after l2actlr updatepop {r1-r5} @ Restore the cpu info - fall through
skip_errata_798870:
#endif#ifdef CONFIG_ARM_ERRATA_801819cmp r2, #0x24 @ Applies to lt including R2p4bgt skip_errata_801819 @ skip if not affected revcmp r2, #0x20 @ Applies to including and above R2p0blt skip_errata_801819 @ skip if not affected revmrc p15, 0, r0, c0, c0, 6 @ pick up REVIDR regand r0, r0, #1 << 3 @ check REVIDR[3]cmp r0, #1 << 3beq skip_errata_801819 @ skip erratum if REVIDR[3] is setmrc p15, 0, r0, c1, c0, 1 @ read auxilary control registerorr r0, r0, #3 << 27 @ Disables streaming. All write-allocate@ lines allocate in the L1 or L2 cache.orr r0, r0, #3 << 25 @ Disables streaming. All write-allocate@ lines allocate in the L1 cache.push {r1-r5} @ Save the cpu info registersbl v7_arch_cp15_set_acrpop {r1-r5} @ Restore the cpu info - fall through
skip_errata_801819:
#endif#ifdef CONFIG_ARM_CORTEX_A15_CVE_2017_5715mrc p15, 0, r0, c1, c0, 1 @ read auxilary control registerorr r0, r0, #1 << 0 @ Enable invalidates of BTBpush {r1-r5} @ Save the cpu info registersbl v7_arch_cp15_set_acrpop {r1-r5} @ Restore the cpu info - fall through
#endif#ifdef CONFIG_ARM_ERRATA_454179mrc p15, 0, r0, c1, c0, 1 @ Read ACRcmp r2, #0x21 @ Only on < r2p1orrlt r0, r0, #(0x3 << 6) @ Set DBSM(BIT7) and IBE(BIT6) bitspush {r1-r5} @ Save the cpu info registersbl v7_arch_cp15_set_acrpop {r1-r5} @ Restore the cpu info - fall through
#endif#if defined(CONFIG_ARM_ERRATA_430973) || defined (CONFIG_ARM_CORTEX_A8_CVE_2017_5715)mrc p15, 0, r0, c1, c0, 1 @ Read ACR#ifdef CONFIG_ARM_CORTEX_A8_CVE_2017_5715orr r0, r0, #(0x1 << 6) @ Set IBE bit always to enable OS WA
#elsecmp r2, #0x21 @ Only on < r2p1orrlt r0, r0, #(0x1 << 6) @ Set IBE bit
#endifpush {r1-r5} @ Save the cpu info registersbl v7_arch_cp15_set_acrpop {r1-r5} @ Restore the cpu info - fall through
#endif#ifdef CONFIG_ARM_ERRATA_621766mrc p15, 0, r0, c1, c0, 1 @ Read ACRcmp r2, #0x21 @ Only on < r2p1orrlt r0, r0, #(0x1 << 5) @ Set L1NEON bitpush {r1-r5} @ Save the cpu info registersbl v7_arch_cp15_set_acrpop {r1-r5} @ Restore the cpu info - fall through
#endif#ifdef CONFIG_ARM_ERRATA_725233mrc p15, 1, r0, c9, c0, 2 @ Read L2ACRcmp r2, #0x21 @ Only on < r2p1 (Cortex A8)orrlt r0, r0, #(0x1 << 27) @ L2 PLD data forwarding disablepush {r1-r5} @ Save the cpu info registersbl v7_arch_cp15_set_l2aux_ctrlpop {r1-r5} @ Restore the cpu info - fall through
#endif#ifdef CONFIG_ARM_ERRATA_852421mrc p15, 0, r0, c15, c0, 1 @ read diagnostic registerorr r0, r0, #1 << 24 @ set bit #24mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
#endif#ifdef CONFIG_ARM_ERRATA_852423mrc p15, 0, r0, c15, c0, 1 @ read diagnostic registerorr r0, r0, #1 << 12 @ set bit #12mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
#endifmov pc, r5 @ back to my caller
ENDPROC(cpu_init_cp15)#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) && \\!defined(CONFIG_SKIP_LOWLEVEL_INIT_ONLY)
/* CPU_init_critical registers setup important registers* setup memory timing/
ENTRY(cpu_init_crit)/ Jump to board specific initialization...* The Mask ROM will have already initialized* basic memory. Go here to bump up clock rate and handle* wake up conditions.*/b lowlevel_init @ go setup pll,mux,memory
ENDPROC(cpu_init_crit)
#endif
reset:是第一个被执行的汇编位置。
bl _main:跳转到main函数,文件位置:u-boot-2018/arch/arm/lib/crt0.S
路径:u-boot-2018/arch/arm/lib/crt0.S
/* SPDX-License-Identifier: GPL-2.0+ */
/ crt0 - C-runtime startup Code for ARM U-Boot Copyright (c) 2012 Albert ARIBAUD <albert.u.boot@aribaud.net>*/#include <config.h>
#include <asm-offsets.h>
#include <linux/linkage.h>
#ifdef CONFIG_CPU_V7M
#include <asm/armv7m.h>
#endif/ This file handles the target-independent stages of the U-Boot* start-up where a C runtime environment is needed. Its entry point* is _main and is branched into from the target's start.S file. _main execution sequence is: 1. Set up initial environment for calling board_init_f().* This environment only provides a stack and a place to store* the GD ('global data') structure, both located in some readily* available RAM (SRAM, locked cache...). In this context, VARIABLE* global data, initialized or not (BSS), are UNAVAILABLE; only* CONSTANT initialized data are available. GD should be zeroed* before board_init_f() is called. 2. Call board_init_f(). This function prepares the hardware for* execution from system RAM (DRAM, DDR...) As system RAM may not* be available yet, , board_init_f() must use the current GD to* store any data which must be passed on to later stages. These* data include the relocation destination, the future stack, and* the future GD location. 3. Set up intermediate environment where the stack and GD are the* ones allocated by board_init_f() in system RAM, but BSS and* initialized non-const data are still not available. 4a.For U-Boot proper (not SPL), call relocate_code(). This function* relocates U-Boot from its current location into the relocation* destination computed by board_init_f(). 4b.For SPL, board_init_f() just returns (to crt0). There is no* code relocation in SPL. 5. Set up final environment for calling board_init_r(). This* environment has BSS (initialized to 0), initialized non-const* data (initialized to their intended value), and stack in system* RAM (for SPL moving the stack and GD into RAM is optional - see* CONFIG_SPL_STACK_R). GD has retained values set by board_init_f(). 6. For U-Boot proper (not SPL), some CPUs have some work left to do* at this point regarding memory, so call c_runtime_cpu_setup. 7. Branch to board_init_r(). For more information see 'Board Initialisation Flow in README.*// entry point of crt0 sequence*/ENTRY(_main)/ Set up initial C runtime environment and call board_init_f(0).*/#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)ldr r0, =(CONFIG_SPL_STACK)
#elseldr r0, =(CONFIG_SYS_INIT_SP_ADDR)
#endifbic r0, r0, #7 /* 8-byte alignment for ABI compliance */mov sp, r0bl board_init_f_alloc_reservemov sp, r0/* set up gd here, outside any C code */mov r9, r0bl board_init_f_init_reservemov r0, #0bl board_init_f#if ! defined(CONFIG_SPL_BUILD)/ Set up intermediate environment (new sp and gd) and call* relocate_code(addr_moni). Trick here is that we'll return* 'here' but relocated.*/ldr r0, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp */bic r0, r0, #7 /* 8-byte alignment for ABI compliance */mov sp, r0ldr r9, [r9, #GD_BD] /* r9 = gd->bd */sub r9, r9, #GD_SIZE /* new GD is below bd */adr lr, hereldr r0, [r9, #GD_RELOC_OFF] /* r0 = gd->reloc_off */add lr, lr, r0
#if defined(CONFIG_CPU_V7M)orr lr, #1 /* As required by Thumb-only */
#endifldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */b relocate_code
here:
/ now relocate vectors*/bl relocate_vectors/* Set up final (full) environment */bl c_runtime_cpu_setup /* we still call old routine here */
#endif
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_FRAMEWORK)
# ifdef CONFIG_SPL_BUILD/* Use a DRAM stack for the rest of SPL, if requested */bl spl_relocate_stack_gdcmp r0, #0movne sp, r0movne r9, r0
# endifldr r0, =__bss_start /* this is auto-relocated! */#ifdef CONFIG_USE_ARCH_MEMSETldr r3, =__bss_end /* this is auto-relocated! */mov r1, #0x00000000 /* prepare zero to clear BSS */subs r2, r3, r0 /* r2 = memset len */bl memset
#elseldr r1, =__bss_end /* this is auto-relocated! */mov r2, #0x00000000 /* prepare zero to clear BSS */clbss_l:cmp r0, r1 /* while not at end of BSS */
#if defined(CONFIG_CPU_V7M)itt lo
#endifstrlo r2, [r0] /* clear 32-bit BSS word */addlo r0, r0, #4 /* move to next */blo clbss_l
#endif#if ! defined(CONFIG_SPL_BUILD)bl coloured_LED_initbl red_led_on
#endif/* call board_init_r(gd_t *id, ulong dest_addr) */mov r0, r9 /* gd_t */ldr r1, [r9, #GD_RELOCADDR] /* dest_addr *//* call board_init_r */
#if CONFIG_IS_ENABLED(SYS_THUMB_BUILD)ldr lr, =board_init_r /* this is auto-relocated! */bx lr
#elseldr pc, =board_init_r /* this is auto-relocated! */
#endif/* we should not return here. */
#endifENDPROC(_main)
ENTRY(_main):入口函数
board_init_f:与平台相关的函数,路径:u-boot-2014.07\\common\\board_f.c
board_init_r:
路径:u-boot-2014.07\\common\\board_f.c
workmode = 16,storage type = 0 //u-boot-2014.07\\drivers\\sunxi_flash\\sunxi_flash.c sunxi_flash_handle_init 函数
[ 12.759]NAND_UbootProbe start
[ 12.762]NB1 : enter phy init
[ 12.765]nand_physic_init
[ 12.773]Reset NDFC start 0 0
[ 12.773]Reset NDFC end 0 0
路径:u-boot-2014.07\\common\\board_r.c
U_BOOT_CMD(烧写函数)
位置:include/configs/sun8iw10p1.h:283:
函数:SUNXI_SPRITE_ENV环境变量
CONFIG_SUNXI_SPRITE_ENV_SETTINGS="bootdelay=0\\0bootcmd=run sunxi_sprite_test\\0console=ttyS0,115200\\0sunxi_sprite_test=sprite_test read\\0"
U_BOOT_CMD(sprite_test, 2, 0, do_sprite_test,"do a sprite test","NULL"
);
以上的sprite_test函数被调用流程
步骤1:boot启动延时函数
位置:u-boot-2014.07\\common\\autoboot.c
函数:bootdelay_process(void)
s = getenv("bootcmd"); //其中的bootcmd是上面CONFIG_SUNXI_SPRITE_ENV_SETTINGS配置
步骤2:自动启动传递的命令参数
位置:u-boot-2014.07\\common\\main.c
函数:autoboot_command(s); //上面的参数s传给当前函数
步骤2:运行命令
位置:u-boot-2014.07\\common\\autoboot.c
函数:run_command_list(s, -1, 0); //上面的参数s传给当前函数,即sprite_test
特别注意,上面的“bootdelay=0”,所以以下函数不会执行内核验签,即在烧写镜像环境不会执行的
Uboot用户自定义程序(未找到被调用的位置)
U_BOOT_CMD(go, CONFIG_SYS_MAXARGS, 1, do_go,"start application at address 'addr'","addr [arg ...]\\n - start application at address 'addr'\\n"" passing 'arg' as arguments"
);
SUNXI_USB
结构体申明
typedef struct sunxi_usb_setup_req_s
{int (* state_init )(void);int (* state_exit )(void);void (* state_reset )(void);int (* standard_req_op )(uint cmd, struct usb_device_request *req, uchar *buffer);int (* nonstandard_req_op)(uint cmd, struct usb_device_request *req, uchar *buffer, uint data_status);int (* state_loop )(void *sunxi_udc);void (* dma_rx_isr )(void *p_arg);void (* dma_tx_isr )(void *p_arg);
}
sunxi_usb_setup_req_t;
结构体定义
路径:u-boot-2014.07\\usb_sunxi\\usb_efex.c定义一个usb模块,初始化相关的函数指针
sunxi_usb_module_init(SUNXI_USB_DEVICE_EFEX, \\sunxi_efex_init, \\sunxi_efex_exit, \\sunxi_efex_reset, \\sunxi_efex_standard_req_op, \\sunxi_efex_nonstandard_req_op, \\sunxi_efex_state_loop, \\sunxi_efex_usb_rx_dma_isr, \\sunxi_efex_usb_tx_dma_isr \\);
sunxi_usb_module_init
#define sunxi_usb_module_init(name, state_init, state_exit, state_reset, standard_req_op, nonstandard_req_op, state_loop, dma_rx_isr, dma_tx_isr) \\__sunxi_usb_module_init(name, state_init, state_exit, state_reset, standard_req_op, nonstandard_req_op, state_loop, dma_rx_isr, dma_tx_isr)__sunxi_usb_module_init
#define __sunxi_usb_module_init(name, state_init, state_exit, state_reset, standard_req_op, nonstandard_req_op, state_loop, dma_rx_isr, dma_tx_isr) \\sunxi_usb_setup_req_t setup_req_##name = {state_init, state_exit, state_reset, standard_req_op, nonstandard_req_op, state_loop, dma_rx_isr, dma_tx_isr };说明:setup_req_##name:即为定义的结构体名称__sunxi_usb_module_reg
#define __sunxi_usb_module_reg(name) \\sunxi_udev_active = &setup_req_##name说明:
1.模块注册,即绑定__sunxi_usb_module_init内初始化的结构体
2.sunxi_udev_active即为全局的USB操作结构体对象
sunxi_usb_module_reg(name)
#define sunxi_usb_module_reg(name) \\__sunxi_usb_module_reg(name)
dram_data_recv_finish
要剖析这个函数以及unxi_usb_module_init(SUNXI_USB_DEVICE_EFEX的结构体中函数的使用,在烧写的时候抓USB包分析。
Uboot中添加环境变量
setenv("partitions", partition_sets);