日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uboot 分析之 启动流程

發布時間:2024/9/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uboot 分析之 启动流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
uboot的啟動流程: 看一幅圖:
1.第一階段:start.s的內容:

點擊(此處)折疊或打開

  • #include <config.h> @該文件是第二步中mkconfig文件執行時創建的。include/config.h
  • #include <version.h>
  • #include <status_led.h> @在include目錄下。
  • /*
  • *************************************************************************
  • *
  • * Jump vector table as in table 3.1 in [1]
  • *
  • *************************************************************************
  • */
  • @這是一個異常跳轉表,
  • .globl _start
  • _start:?
  • b start_code? @start_code才是真正的啟動代碼
  • ldr pc, _undefined_instruction
  • ldr pc, _software_interrupt
  • ldr pc, _prefetch_abort
  • ldr pc, _data_abort
  • ldr pc, _not_used
  • ldr pc, _irq
  • ldr pc, _fiq

  • _undefined_instruction: .word undefined_instruction @在標號_undefined_instruction處存儲了一個變量,該變量也是一個標號地址
  • _software_interrupt: .word software_interrupt @執行上面的ldr pc, _undefined_instruction;指令會將變量undefined_instruction的值裝入PC
  • _prefetch_abort: .word prefetch_abort @pc指向一個地址,CPU從該地址中取指執行
  • _data_abort: .word data_abort
  • _not_used: .word not_used
  • _irq: .word irq
  • _fiq: .word fiq
  • .balignl 16,0xdeadbeef
  • /*
  • *************************************************************************
  • *
  • * Startup Code (called from the ARM reset exception vector)
  • *
  • * do important init only if we don't start from memory!
  • * relocate armboot to ram
  • * setup stack
  • * jump to second stage
  • *
  • *************************************************************************
  • */
  • _TEXT_BASE:
  • .word?TEXT_BASE @變量TEXT_BASE由連接腳本指定,

  • .globl _armboot_start

  • _armboot_start:
  • .word?_start @_start是在起始代碼處定義的標號,當跳到_armboot_start后還是會跳轉到_start
  • /*
  • * These are defined in the board-specific linker script.
  • */
  • .globl _bss_start

  • _bss_start:
  • .word?__bss_start? @這是board/mini2440/u-boot.lds腳本中的變量,

  • .globl _bss_end
  • _bss_end:
  • .word?_end? @這也是board/mini2440/u-boot.lds腳本中的變量,

  • #ifdef CONFIG_USE_IRQ? @這個宏在include/configs/$(board_name).h中定義。可以取消
  • /* IRQ stack memory (calculated at run-time) */
  • .globl IRQ_STACK_START
  • IRQ_STACK_START:
  • .word 0x0badc0de
  • /* IRQ stack memory (calculated at run-time) */
  • .globl FIQ_STACK_START
  • FIQ_STACK_START:
  • .word 0x0badc0de
  • #endif
  • /*
  • * the actual start code
  • */

  • start_code:? @這是真正的啟動代碼
  • /*?set the cpu to SVC32 mode*/
  • mrs r0,cpsr
  • bic r0,r0,#0x1f
  • orr r0,r0,#0xd3
  • msr cpsr,r0
  • bl coloured_LED_init @這個函數在status_led.h中被提升了作用域,但是在哪里面實現??status_led.h文件
  • bl red_LED_on @同上
  • @下面這些宏開關也是在include/configs/$(board_name).h中定義??
  • #if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)

  • /*
  • * relocate exception table
  • */
  • ldr r0, =_start
  • ldr r1, =0x0
  • mov r2, #16

  • copyex:
  • subs r2, r2, #1
  • ldr r3, [r0], #4
  • str r3, [r1], #4
  • bne copyex
  • #endif

  • @下面這些宏開關是在include/configs/$(board_name).h中定義
  • #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
  • /* turn off the watchdog */
  • # if defined(CONFIG_S3C2400)
  • # define pWTCON 0x15300000
  • # define INTMSK 0x14400008 /* Interupt-Controller base addresses */
  • # define CLKDIVN 0x14800014 /* clock divisor register */
  • #else
  • # define pWTCON 0x53000000
  • # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
  • # define INTSUBMSK 0x4A00001C
  • # define CLKDIVN 0x4C000014 /* clock divisor register */
  • # endif
  • #define CLK_CTL_BASE 0x4c000000
  • #define MDIV_405 0x7f<<12
  • #define PSDIV_405 0x21
  • #define UPLL_MDIV_48 0x38<<12
  • #define UPLL_PSDIV_48 0x22
  • #define MDIV_200 0xa1<<12
  • #define PSDIV_200 0x31
  • ldr r0, =pWTCON
  • mov r1, #0x0
  • str r1, [r0]

  • /*
  • * mask all IRQs by setting all bits in the INTMR - default
  • */
  • mov r1, #0xffffffff
  • ldr r0, =INTMSK
  • str r1, [r0]
  • # if defined(CONFIG_S3C2410)
  • ldr r1, =0x3ff
  • ldr r0, =INTSUBMSK
  • str r1, [r0]
  • # endif

  • /*add by gray*/
  • #if defined(CONFIG_S3C2440)
  • ldr r1, =0x7fff
  • ldr r0, =INTSUBMSK
  • str r1, [r0]
  • #endif

  • /*add by gray,這里是修改后的,其實可以在uboot啟動的第二階段start_armboot()函數里調用board_init()函數時重置CPU鐘
  • 對于S3C2440,MPLL(clk)=(2 * m * Fin) / p * 2^s,
  • m = MDIV + 8, p = PDIV + 2, s =?SDIV.
  • 這里MDIV =? 0x7f, PDIV = 0x2 ,SDIV = 0x1?
  • */
  • #if defined(CONFIG_S3C2440)
  • /*FCLK:HCLK:PCLK=1:2:4*/
  • ldr r0,?=CLKDIVN
  • mov r1, #5
  • str r1,[r0]
  • mrc p15,0,r1,c1,c0,0 /*read ctrl reg*/
  • orr r1,r1,#0xc0000000 /*ASYN*/
  • mcr p15,0,r1,c1,c0,0 /*write ctrl reg*/
  • mov r1,#CLK_CTL_BASE
  • mov r2,#UPLL_MDIV_48
  • add r2, r2,#UPLL_PSDIV_48
  • str r2,[r1,#0x08] /*write UPLL first,48MHZ*/
  • mov r2,#MDIV_405
  • add r2,r2,#PSDIV_405? /*mpll_405MHZ*/
  • str r2,[r1,#0x04]? /*MPLLCON*/
  • #else
  • /*F:H:P=1:2:4*/
  • ldr r0, =CLKDIVN
  • mov r1, #3
  • str r1,[r0]
  • mrc p15,0,r1,c1,c0,0? /*read ctrl reg*/
  • orr r1,r1,#0xc0000000
  • mcr p15,0,r1,c1,c0,0
  • mov r1,#CLK_CTL_BASE
  • mov r2,#MDIV_200
  • add r2,r2,#PSDIV_200? /*mpll_200MHZ*/
  • str r2,[r1,#0x04]? /*MPLLCON*/
  • #endif
  • #endif /*CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440*/

  • /*
  • * we do sys-critical inits only at reboot,
  • * not when booting from ram!
  • */

  • #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  • bl cpu_init_crit @如果沒有定義CONFIG_SKIP_LOWLEVEL_INIT,就進行嚴格的初始化,調用lowlevel_init函數
  • #endif
  • #ifndef CONFIG_AT91RM9200 @AT91RM9200評估板,基于ARM920T內核
  • #ifndef CONFIG_SKIP_RELOCATE_UBOOT

  • /* relocate U-Boot to RAM */
  • relocate:?
  • adr r0, _start ? /* r0 <- current position of code */
  • ldr r1, _TEXT_BASE? /* test if we run from flash or RAM */
  • cmp r0, r1? /* don't reloc during debug */
  • beq stack_setup ? /*如果_start與_TEXT_BASE相等,就直接跳去stack_setup進行棧的設置, 否則就要進行代碼的拷貝,把代碼拷貝到內存中*/

  • ldr r2, _armboot_start
  • ldr r3, _bss_start? @計算代碼段大小=_bss_start-_armboot_start
  • sub r2, r3, r2? /* r2 <- size of armboot */
  • add r2, r0, r2? /* r2 <- source end address */
  • @ r2 = _start的地址+代碼段大小
  • copy_loop:
  • ldmia r0!, {r3-r10}? /* copy from source address [r0] */
  • stmia r1!, {r3-r10}? /* copy to target address [r1] */
  • cmp r0, r2? /* until source end addreee [r2] */
  • ble copy_loop
  • #endif? /* CONFIG_SKIP_RELOCATE_UBOOT */
  • #endif
  • /* Set up the stack,設置棧 */
  • stack_setup:
  • ldr r0,?_TEXT_BASE?/*?upper 128 KiB: relocated uboot?*/
  • sub r0, r0, #CFG_MALLOC_LEN? /* malloc area,這是堆區 */
  • sub r0, r0, #CFG_GBL_DATA_SIZE? /* bdinfo */
  • #ifdef CONFIG_USE_IRQ @如果定義了IRQ,就要為IRQ,FIQ分配中斷棧。
  • sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
  • #endif
  • sub sp, r0, #12? /* leave 3 words for abort-stack */
  • clear_bss:? @清除bss段,_bss_start 和_bss_end就是u-boot.lds腳本傳入的變量
  • ldr r0,?_bss_start? /* find start of bss segment */
  • ldr r1,?_bss_end? /* stop here */
  • mov r2, #0x00000000? /* clear */
  • clbss_l:str r2, [r0]? /* clear loop... */
  • add r0, r0, #4
  • cmp r0, r1
  • ble clbss_l

  • ldr pc, _start_armboot
  • _start_armboot: .word?start_armboot?@跳到start_armboot()函數執行,進入uboot的第二階段
  • /*
  • *************************************************************************
  • *
  • * CPU_init_critical registers
  • *
  • * setup important registers
  • * setup memory timing
  • *
  • *************************************************************************
  • */
  • #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  • cpu_init_crit:? @進行嚴格的初始化,關閉I/D caches,MMU,

  • /*
  • * flush v4 I/D caches
  • */
  • mov r0, #0
  • mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
  • mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */

  • /*
  • * disable MMU stuff and caches
  • */
  • mrc p15, 0, r0, c1, c0, 0
  • bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
  • bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
  • orr r0, r0, #0x00000002 @ set bit 2 (A) Align
  • orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
  • mcr p15, 0, r0, c1, c0, 0

  • /*
  • * before relocating, we have to setup RAM timing
  • * because memory timing is board-dependend, you will
  • * find a lowlevel_init.S in your board directory.
  • */

  • mov ip, lr
  • #if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)
  • #else

  • bl lowlevel_init? @這個函數是重點。。在lowlevel_init.S中
  • #endif

  • mov lr, ip
  • mov pc, lr
  • #endif? /* CONFIG_SKIP_LOWLEVEL_INIT */
  • lowlevel_init.S的內容:
  • _TEXT_BASE:
  • .word TEXT_BASE
  • .globl lowlevel_init

  • lowlevel_init:? @很明顯,是初始化SDRAM
  • /* memory control configuration */
  • /* make r0 relative the current location so that it */
  • /* reads SMRDATA out of FLASH rather than memory ! */
  • ldr r0, =SMRDATA
  • ldr r1, _TEXT_BASE
  • sub r0, r0, r1
  • ldr r1, =BWSCON? /* Bus Width Status Controller */
  • add r2, r0, #13*4

  • 0:
  • ldr r3, [r0], #4
  • str r3, [r1], #4
  • cmp r2, r0
  • bne 0b

  • /* everything is fine now */
  • mov pc, lr
  • .ltorg


  • 2.進入uboot啟動的第二階段:start_armboot()

    點擊(此處)折疊或打開

  • start_armboot()在board.c中,處于lib_arm/,在進入lib_arm目錄下編譯LIBS目標時依賴board.o文件

  • void start_armboot?(void)
  • {
  • ?init_fnc_t?**init_fnc_ptr;
  • ?char?*s;

  • #if?!defined(CFG_NO_FLASH)?||?defined?(CONFIG_VFD)?||?defined(CONFIG_LCD)
  • ?ulong size;
  • #endif

  • #if?defined(CONFIG_VFD)?||?defined(CONFIG_LCD)
  • ?unsigned long addr;
  • #endif

  • ?//gd是個寄存器變量,ARM平臺對應R8寄存器
  • ?/*?Pointer?is?writable since we allocated a register?for?it
  • ??*_armboot_start是代碼的起始地址,鏈接腳本指定為0x33f80000,CFG_MALLOC_LEN=192k,
  • ??*所以gd的起始地址=0x33F50000
  • ??*/

  • ?gd?=?(gd_t*)(_armboot_start?-?CFG_MALLOC_LEN?-?sizeof(gd_t));
  • ?/*?compiler optimization barrier needed?for?GCC?>=?3.4?*/
  • ?__asm__ __volatile__("":?:?:"memory");

  • ?memset?((void*)gd,?0,?sizeof?(gd_t));//清空gd_t結構體

  • ?gd->bd?=?(bd_t*)((char*)gd?-?sizeof(bd_t));//bd_t結構體

  • ?memset?(gd->bd,?0,?sizeof?(bd_t));?
  • ?gd->flags?|=?GD_FLG_RELOC;

  • ?monitor_flash_len?=?_bss_start?-?_armboot_start;//uboot代碼的長度

  • ?//對結構體init_fnc_t?*init_sequence[]數組中的函數指針挨個調用
  • ?for?(init_fnc_ptr?=?init_sequence;?*init_fnc_ptr;?++init_fnc_ptr)?{
  • ??if?((*init_fnc_ptr)()?!=?0)?{
  • ???hang?();
  • ??}
  • ?}

  • ?/*?初始化flash*/
  • ?size?=?flash_init?();

  • ?。。。。。。

  • ?/*?初始化一個堆空間?*/
  • ?mem_malloc_init?(_armboot_start?-?CFG_MALLOC_LEN);

  • ?nand_init();?/*?go init the NAND?*/

  • ?/*?初始化環境變量,將環境參數讀入內存指定位置?*/
  • ?env_relocate?();

  • ?/*?must?do?this after the framebuffer?is?allocated,串口初始化?*/
  • ?serial_initialize();

  • ?/*?IP Address?*/
  • ?gd->bd->bi_ip_addr?=?getenv_IPaddr?("ipaddr");
  • ?/*?MAC Address,省略?*/

  • ?devices_init?();?/*?get?the devices list going.?*/

  • ?jumptable_init?();?/*?跳轉表初始化?*/

  • ?console_init_r?();?/*?fully init console as a device?*/

  • ?/*?使能異常中斷?*/
  • ?enable_interrupts?();
  • ?/*?Perform network card initialisation?if?necessary?*/

  • #ifdef CONFIG_DRIVER_CS8900
  • ?cs8900_get_enetaddr?(gd->bd->bi_enetaddr);
  • #endif

  • ?/*?main_loop()?can return?to?retry autoboot,?if?so just run it again.?*/

  • ?for?(;;)?{
  • ??main_loop?();
  • ?}

  • ?/*?NOTREACHED?-?no way out of command?loop?except booting?*/
  • }

  • ??init_fnc_t?*init_sequence[]?=?{
  • ?????????cpu_init,?/*?基本的處理器相關配置,初始化IRQ/FIQ模式的棧?--?cpu/arm920t/cpu.c?*/
  • ?????????board_init,?/*?基本的板級相關配置,設置系統時鐘等?--?board/smdk2410/smdk2410.c?*/
  • ?????????interrupt_init,?/*?初始化定時器處理?--?cpu/arm920t/s3c24x0/interrupt.c?*/
  • ?????????env_init,?/*?初始化環境變量,檢查Flash上的環境參數是否有效?--?common/env_flash.c?*/
  • ?????????init_baudrate,?/*?初始化波特率設置?--?lib_arm/board.c?*/
  • ?????????serial_init,?/*?串口通訊設置?--?cpu/arm920t/s3c24x0/serial.c?*/
  • ?????????console_init_f,?/*?控制臺初始化階段1?--?common/console.c?*/
  • ?????????display_banner,?/*?打印u-boot信息?--?lib_arm/board.c?*/
  • ?????????dram_init,?/*?配置可用的RAM,檢測系統內存映射?--?board/smdk2410/smdk2410.c?*/
  • ?????????display_dram_config,?/*?顯示RAM的配置大小?--?lib_arm/board.c?*/
  • ?????????NULL,
  • ??};

  • ??下面逐個分析初始化函數:
  • 1.int?cpu_init?(void)
  • {
  • ?/*?setup up stacks?if?necessary?*/
  • #ifdef CONFIG_USE_IRQ
  • ?IRQ_STACK_START?=?_armboot_start?-?CFG_MALLOC_LEN?-?CFG_GBL_DATA_SIZE?-?4;
  • ?FIQ_STACK_START?=?IRQ_STACK_START?-?CONFIG_STACKSIZE_IRQ;
  • #endif
  • ?return 0;
  • }

  • 2.int?board_init?(void)//設置系統時鐘,配置引腳,使能緩存
  • {
  • ?S3C24X0_CLOCK_POWER?*?const?clk_power?=?S3C24X0_GetBase_CLOCK_POWER();
  • ?S3C24X0_GPIO?*?const?gpio?=?S3C24X0_GetBase_GPIO();

  • ?/*?to?reduce PLL lock?time,?adjust the LOCKTIME register?*/
  • ?clk_power->LOCKTIME?=?0xFFFFFF;

  • ?/*?configure MPLL?*/
  • ?clk_power->MPLLCON?=?((M_MDIV?<<?12)?+?(M_PDIV?<<?4)?+?M_SDIV);
  • ?......
  • ?/*?configure UPLL?*/
  • ?clk_power->UPLLCON?=?((U_M_MDIV?<<?12)?+?(U_M_PDIV?<<?4)?+?U_M_SDIV);
  • ?......
  • ?/*?set?up the I/O ports?*/
  • ?gpio->GPACON?=?0x007FFFFF;
  • ?gpio->GPBCON?=?0x00044555;
  • ?gpio->GPBUP?=?0x000007FF;
  • ?gpio->GPCCON?=?0xAAAAAAAA;
  • ?gpio->GPCUP?=?0x0000FFFF;
  • ?gpio->GPDCON?=?0xAAAAAAAA;
  • ?gpio->GPDUP?=?0x0000FFFF;
  • ?gpio->GPECON?=?0xAAAAAAAA;
  • ?gpio->GPEUP?=?0x0000FFFF;
  • ?gpio->GPFCON?=?0x000055AA;
  • ?gpio->GPFUP?=?0x000000FF;
  • ?gpio->GPGCON?=?0xFF95FFBA;
  • ?gpio->GPGUP?=?0x0000FFFF;
  • ?gpio->GPHCON?=?0x002AFAAA;
  • ?gpio->GPHUP?=?0x000007FF;

  • ?/*?arch number of SMDK2410-Board?*/
  • ?gd->bd->bi_arch_number?=?MACH_TYPE_SMDK2410;

  • ?/*?address of boot parameters?*/
  • ?gd->bd->bi_boot_params?=?0x30000100;//為什么是這個地址
  • ?icache_enable();//下面這兩個函數都是設置協處理器的相關寄存器,使能緩存
  • ?dcache_enable();
  • }

  • 3.int?interrupt_init?(void) //初始化2410的PWM timer 4,使其能自動裝載計數值,
  • ??? //恒定的產生時間中斷信號,但是中斷被屏蔽了用不上。
  • {
  • ?S3C24X0_TIMERS?*?const?timers?=?S3C24X0_GetBase_TIMERS();

  • ?/*?use PWM Timer 4 because it has no output?*/
  • ?/*?prescaler?for?Timer 4?is?16?*/
  • ?timers->TCFG0?=?0x0f00;

  • ?if?(timer_load_val?==?0)
  • ?{
  • ??/*
  • ???*?for?10 ms clock period @ PCLK with 4 bit divider?=?1/2
  • ???*?(default)?and?prescaler?=?16.?Should be 10390
  • ???*?@33.25MHz?and?15625 @ 50 MHz
  • ???*/
  • ??timer_load_val?=?get_PCLK()/(2?*?16?*?100);
  • ?}

  • ?/*?load value?for?10 ms timeout?*/
  • ?lastdec?=?timers->TCNTB4?=?timer_load_val;

  • ?/*?auto load,?manual update of Timer 4?*/
  • ?timers->TCON?=?(timers->TCON?&?~0x0700000)?|?0x600000;

  • ?/*?auto load,?start Timer 4?*/
  • ?timers->TCON?=?(timers->TCON?&?~0x0700000)?|?0x500000;

  • ?timestamp?=?0;
  • ?return?(0);
  • }

  • 4.int?env_init(void)
  • {
  • ?int?crc1_ok?=?0,?crc2_ok?=?0;
  • ?uchar flag1?=?flash_addr->flags;
  • ?uchar flag2?=?flash_addr_new->flags;
  • ?ulong addr_default?=?(ulong)&default_environment[0];
  • ?ulong addr1?=?(ulong)&(flash_addr->data);
  • ?ulong addr2?=?(ulong)&(flash_addr_new->data);
  • ?crc1_ok?=?(crc32(0,?flash_addr->data,?ENV_SIZE)?==?flash_addr->crc);
  • ?crc2_ok?=?(crc32(0,?flash_addr_new->data,?ENV_SIZE)?==?flash_addr_new->crc);

  • ?if?(crc1_ok?&&?!?crc2_ok)?{
  • ??gd->env_addr?=?addr1;
  • ??gd->env_valid?=?1;
  • ?}?else?if?(!?crc1_ok?&&?crc2_ok)?{
  • ??gd->env_addr?=?addr2;
  • ??gd->env_valid?=?1;
  • ?}?else?if?(!?crc1_ok?&&?!?crc2_ok)?{
  • ??gd->env_addr?=?addr_default;
  • ??gd->env_valid?=?0;
  • ?}?else?if?(flag1?==?ACTIVE_FLAG?&&?flag2?==?OBSOLETE_FLAG)?{
  • ??gd->env_addr?=?addr1;
  • ??gd->env_valid?=?1;
  • ?}?else?if?(flag1?==?OBSOLETE_FLAG?&&?flag2?==?ACTIVE_FLAG)?{
  • ??gd->env_addr?=?addr2;
  • ??gd->env_valid?=?1;
  • ?}?else?if?(flag1?==?flag2)?{
  • ??gd->env_addr?=?addr1;
  • ??gd->env_valid?=?2;
  • ?}?else?if?(flag1?==?0xFF)?{
  • ??gd->env_addr?=?addr1;
  • ??gd->env_valid?=?2;
  • ?}?else?if?(flag2?==?0xFF)?{
  • ??gd->env_addr?=?addr2;
  • ??gd->env_valid?=?2;
  • ?}
  • ?return?(0);
  • }

  • PS:
    uboot的重要的數據結構
    1)gd  全局數據變量指針,它保存了u-boot運行需要的全局數據,類型定義:
    ? typedef struct global_data {
    ?????????? bd_t? *bd;????? //board data pointor板子數據指針
    ?????????? unsigned long flags;  ?//指示標志,如設備已經初始化標志等。
    ?????????? unsigned long baudrate; //串口波特率
    ?????????? unsigned long have_console; /* 串口初始化標志*/
    ?????????? unsigned long reloc_off;?? /* 重定位偏移,就是實際定向的位置與編譯連接時指定的位置之差,一般為0 */
    ?????????? unsigned long env_addr; /* 環境參數地址*/
    ?????????? unsigned long env_valid; /* 環境參數CRC檢驗有效標志 */
    ?????????? unsigned long fb_base; /* base address of frame buffer */
    ?????????  #ifdef CONFIG_VFD
    ?????????? unsigned char vfd_type; /* display type */
    ?????????  #endif
    ?????????? void? **jt;? /* 跳轉表,1.1.6中用來函數調用地址登記 */
    ????????? } gd_t;
    2)bd 板子數據指針。板子很多重要的參數。 類型定義如下:????
    ?? typedef struct bd_info {
    ???????????? int?? bi_baudrate;???? /* 串口波特率 */
    ???????????? unsigned long bi_ip_addr;?? /* IP 地址 */
    ???????????? unsigned char bi_enetaddr[6]; /* MAC地址*/
    ???????????? struct environment_s??????? *bi_env;
    ???????????? ulong???????? bi_arch_number; /* unique id for this board */
    ???????????? ulong???????? bi_boot_params; /* 啟動參數 */
    ???????????? struct??? ???/* RAM 配置 */
    ???????????? {
    ??????????? ulong start;
    ??????????? ulong size;
    ???????????? }bi_dram[CONFIG_NR_DRAM_BANKS];
    ???????? } bd_t;?
    3)環境變量指針 env_t *env_ptr = (env_t *)(&environment[0]);(common/env_flash.c)
    ?  env_ptr指向環境參數區,系統啟動時默認的環境參數environment[],定義在common/environment.c中。 
    ?  參數解釋:
    ??? bootdelay 定義執行自動啟動的等候秒數?
    ??? baudrate 定義串口控制臺的波特率?
    ??? netmask 定義以太網接口的掩碼?
    ??? ethaddr 定義以太網接口的MAC地址?
    ??? bootfile 定義缺省的下載文件?
    ??? bootargs 定義傳遞給Linux內核的命令行參數?
    ??? bootcmd 定義自動啟動時執行的幾條命令?
    ??? serverip 定義tftp服務器端的IP地址?
    ??? ipaddr 定義本地的IP地址?
    ??? stdin 定義標準輸入設備,一般是串口?
    ??? stdout 定義標準輸出設備,一般是串口?
    ??? stderr 定義標準出錯信息輸出設備,一般是串口?
    ? 4)設備相關:
    ?? 標準IO設備數組?evice_t *stdio_devices[] = { NULL, NULL, NULL };
    ?? 設備列表    list_t??? devlist = 0;
    ?? device_t的定義:include\devices.h中:
    ??? typedef struct {
    ???? int flags;???       /* Device flags: input/output/system */
    ???? int ext;?????      /* Supported extensions?? */
    ???? char name[16];??      /* Device name??? */????
    ??? /* GENERAL functions */????
    ???? int (*start) (void);?    /* To start the device?? */
    ???? int (*stop) (void);?     /* To stop the device?? */????
    ??? /* 輸出函數 */????
    ???? void (*putc) (const char c); /* To put a char?? */
    ???? void (*puts) (const char *s); /* To put a string (accelerator) */???
    ??? /* 輸入函數 */???
    ???? int (*tstc) (void);?     /* To test if a char is ready... */
    ???? int (*getc) (void);?     /* To get that char?? */???
    ??? /* Other functions */????
    ???? void *priv;??        /* Private extensions?? */
    ??? } device_t;
    ?  u-boot把可以用為控制臺輸入輸出的設備添加到設備列表devlist,并把當前用作標準IO的設備指針加入stdio_devices數組中。
    ?  在調用標準IO函數如printf()時將調用stdio_devices數組對應設備的IO函數如putc()。
    5)命令相關的數據結構,后面介紹。
    6)與具體設備有關的數據結構,
    ????  如flash_info_t flash_info[CFG_MAX_FLASH_BANKS];記錄nor flash的信息。
    ????  nand_info_t nand_info[CFG_MAX_NAND_DEVICE]; nand flash塊設備信息
    ?????
    ?????
    5.static int init_baudrate (void)
    {
    ?char tmp[64];?/* long enough for environment variables */
    ?int i = getenv_r ("baudrate", tmp, sizeof (tmp));//環境變量存于tmp緩沖中
    ?gd->bd->bi_baudrate = gd->baudrate = (i > 0)
    ???? (int) simple_strtoul (tmp, NULL, 10)
    ???: CONFIG_BAUDRATE; return (0);
    }
    6.int serial_init()實際調用下面這個函數,在移植時這個函數是第一個要修改的,因為要用到串口輸出信息
    static int serial_init_dev(const int dev_index)
    {
    ?S3C24X0_UART * const uart = S3C24X0_GetBase_UART(dev_index); /* FIFO enable, Tx/Rx FIFO clear */
    ?uart->UFCON = 0x07;?//這里使用的是串口0.
    ?uart->UMCON = 0x0; /* Normal,No parity,1 stop,8 bit */
    ?uart->ULCON = 0x3;
    ?/*
    ? * tx=level,rx=edge,disable timeout int.,enable rx error int.,
    ? * normal,interrupt or polling
    ? */
    ?uart->UCON = 0x245; #ifdef CONFIG_HWFLOW
    ?uart->UMCON = 0x1; /* RTS up */
    #endif /* FIXME: This is sooooooooooooooooooo ugly */
    #if defined(CONFIG_ARCH_GTA02_v1) || defined(CONFIG_ARCH_GTA02_v2)
    ?/* we need auto hw flow control on the gsm and gps port */
    ?if (dev_index == 0 || dev_index == 1)
    ??uart->UMCON = 0x10;
    #endif
    ?_serial_setbrg(dev_index); return (0);
    }
    7.由于標準設備還沒有初始化(gd->flags & GD_FLG_DEVINIT=0),這時控制臺使用串口作為控制臺
    ??? 函數只有一句:gd->have_console = 1;
    int console_init_f (void)
    {
    ?gd->have_console = 1;?//將標志位置1 #ifdef CONFIG_SILENT_CONSOLE
    ?if (getenv("silent") != NULL)
    ??gd->flags |= GD_FLG_SILENT;
    #endif return (0);
    }
    8.int dram_init (void)
    {//PHYS_SDRAM_1在整個include/configs.h文件中有很多定義,只在一個地方define為0x30000000
    ?//PHYS_SDRAM_1_SIZE定義為64MB
    ?gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
    ?gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; return 0;
    }
    9. ulong flash_init (void) 這里smdk2410的默認flash是AMD的,mini2440的板子是SST39F1601,如果NOR Flash符合CFI接口標準,可以使用drivers/cfi_flash.c
    里面的接口函數,否則就得重寫。如果使用cfi_flash.c,需要修改include/configs/$(board_name).h,在里面增加:
    ?#define CFG_FLASH_CFI_DRIVER ?1
    在board/$(board_name)/Makefile中去掉flash.o
    在《嵌入式linux完全手冊》上P273頁有說明。 首先是有一個變量flash_info_t flash_info[CFG_MAX_FLASH_BANKS]來記錄flash的信息。flash_info_t定義:
    ?? typedef struct {
    ??? ulong size;?? /* 總大小BYTE? */
    ??? ushort sector_count;? /* 總的sector數*/
    ??? ulong flash_id;? /* combined device & manufacturer code */
    ??? ulong start[CFG_MAX_FLASH_SECT];?? /* 每個sector的起始物理地址。 */
    ??? uchar protect[CFG_MAX_FLASH_SECT]; /* 每個sector的保護狀態,如果置1,在執行erase操作的時候將跳過對應sector*/
    ???? #ifdef CFG_FLASH_CFI //我不管CFI接口。
    ??? .....
    ???? #endif
    ?? } flash_info_t;
    ??? flash_init()的操作就是讀取ID號,ID號指明了生產商和設備號,根據這些信息設置size,sector_count,flash_id.
    ??? 以及start[]、protect[]。 10.mem_malloc_init()
    11.nand_init()
    12.env_relocate()
    13.devices_init ();?/* get the devices list going. */定義于common/devices.c
    14.jumptable_init ()
    15.console_init_r ();?/* fully init console as a device ,前面結構體中的是前期控制臺初始化,這是后期*/
    主要過程:查看環境參數stdin,stdout,stderr中對標準IO的指定的設備名稱,再按照環境指定的名稱搜索devlist,將搜到的設備指針賦給標準IO數組stdio_devices[]。置gd->flag標志GD_FLG_DEVINIT。這個標志影響putc,getc函數的實現,未定義此標志時直接由串口serial_getc和serial_putc實現,定義以后通過標準設備數組stdio_devices[]中的putc和getc來實現IO。
    ?下面是相關代碼:
    ??? void putc (const char c)
    ???????? {
    ???????? #ifdef CONFIG_SILENT_CONSOLE
    ????????? if (gd->flags & GD_FLG_SILENT)//GD_FLG_SILENT無輸出標志
    ?????????? return;
    ???????? #endif
    ????????? if (gd->flags & GD_FLG_DEVINIT) {//設備list已經初始化
    ?????????? /* Send to the standard output */
    ?????????? fputc (stdout, c);
    ????????? } else {
    ?????????? /* Send directly to the handler */
    ?????????? serial_putc (c);//未初始化時直接從串口輸出。
    ????????? }
    ???????? }
    ?????? void fputc (int file, const char c)
    ??????? {
    ???????? if (file < MAX_FILES)
    ????????? stdio_devices[file]->putc (c);
    ??????? } 為什么要使用devlist,std_device[]? 為了更靈活地實現標準IO重定向,任何可以作為標準IO的設備,如USB鍵盤,LCD屏,串口等都可以對應一個device_t的結構體變量,只需要實現getc和putc等函數,就能加入到devlist列表中去,也就可以被assign為標準IO設備std_device中去。如函數 int console_assign (int file, char *devname); /* Assign the console 重定向標準輸入輸出*/ 這個函數功能就是把名為devname的設備重定向為標準IO文件file(stdin,stdout,stderr)。其執行過程是在devlist中查找devname的設備,返回這個設備的device_t指針,并把指針值賦給std_device[file]。
    16.enable_interrupts (); (1)首先,需要設置系統時鐘、初始化串口,只要這兩個設置好,就能從串口看到打印信息。
    ? board_init函數設置MPLL,改變系統時鐘,這是一個開發板相關的函數。
    ? serial_init函數用來初始化串口,設置UART控制器,是CPU相關的函數,
    ? (2)檢測系統內存映射
    ? 對于特定的開發板,內存分布是比較明確的,dram_init函數指定了目標開發板的內存起始地址為0x30000000,大小為64M
    ? (3)U-boot命令的格式
    ? uboot中的每個命令都是通過U_BOOT_CMD宏來定義,格式:U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help")
    ? 這個宏定義在include/command.h中,
    ? (4)為內核設置啟動參數
    ? uboot是通過標記列表向內核傳遞參數,設置內存標記、命令標記的函數setup_memory_tags、setup_commandline_tag,
    ? 在lib_arm/armlinux.c中定義實現。如果要定義一個命令,需要在include/configs/$(board_name).h中增加一個關于
    ? 命令的配置項:
    ? 如: #define CONFIG_CMDLINE_TAG? 1
    ? 對于arm架構的CPU,都是通過lib_arm/armlinux.c中的do_bootm_linux函數來啟動內核,在這個函數中,設置標記列表,最后通過
    ? the_kernel(0,bd->bi_arch_number,bd->bi_boot_params)調用內核。 PS: 1.分析過程參照了一位網友的文章,很有參考價值,給我很大幫助。我只是按照配置->編譯->啟動過程 的這么一個認識過程來分析,可能會顯得比較混亂。 ?U-BOOT源碼分析及移植.txt?
    ??
    2.博客鏈接:http://blog.csdn.net/liukun321/article/details/5680504

    總結

    以上是生活随笔為你收集整理的uboot 分析之 启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    免费看一级一片 | 亚洲人成人天堂h久久 | 亚洲国产精品久久 | 91视频最新网址 | 亚洲乱亚洲乱妇 | 97精品一区 | 国内丰满少妇猛烈精品播 | 日韩在线免费 | 久草网视频在线观看 | 久久综合色天天久久综合图片 | 久草在线这里只有精品 | 欧美吞精 | 欧美极品少妇xbxb性爽爽视频 | 国产一区二区三区视频在线 | 久久国产精品久久久 | 制服丝袜欧美 | av在线影片 | 久色 网 | 久久午夜国产精品 | 久久久网站 | 91看片淫黄大片一级在线观看 | 亚洲成av片人久久久 | 久久综合九色99 | 成年人免费看片 | 在线观看aaa | 色国产在线 | 成人网看片| 69av久久| 亚洲乱码一区 | 天天爽天天爽 | 国产又粗又硬又爽视频 | 美女网站在线看 | 成人毛片一区 | 在线黄av | 亚洲视频99| 国产美女主播精品一区二区三区 | 亚洲成aⅴ人片久久青草影院 | 天天做天天爱天天爽综合网 | 国产成人高清av | 五月婷婷,六月丁香 | 91麻豆精品国产91久久久久久久久 | 人人插人人舔 | 国产高清在线看 | 91精品国产高清自在线观看 | 27xxoo无遮挡动态视频 | 久久国产视屏 | 成年人免费在线播放 | 亚洲午夜精品在线观看 | 999ZYZ玖玖资源站永久 | 国产美女免费 | 日韩免费高清在线观看 | 婷婷在线网站 | 日韩亚洲国产精品 | 欧美一级视频在线观看 | 日韩影视在线 | 久久精品视频观看 | 亚洲乱码国产乱码精品天美传媒 | 一区二区三区三区在线 | 午夜.dj高清免费观看视频 | 亚洲精品一区二区三区四区高清 | 91福利视频免费观看 | 麻豆久久 | 国产黄色看片 | 88av色 | 91在线视频精品 | 久久精品亚洲 | 欧美日韩精品在线播放 | 国产成人一区二区三区在线观看 | 日韩理论在线观看 | 欧美一级久久久 | 五月婷婷激情综合 | 五月婷婷免费 | 又黄又爽又无遮挡免费的网站 | 国产日产欧美在线观看 | 麻豆视频一区二区 | 国产一区免费 | 免费观看一级特黄欧美大片 | 狠狠操操网| 热久久这里只有精品 | 91精品国产自产在线观看永久 | 日日夜夜噜 | 91在线视频免费 | 91久久久久久久 | 99色| 91av视屏 | 99热国产精品 | 69性欧美| 国产日韩精品一区二区三区 | 一级淫片a| 成人午夜在线电影 | 96精品视频 | 草久中文字幕 | 国产精品久久久久婷婷 | 亚洲aⅴ在线观看 | 亚州日韩中文字幕 | 91在线视频 | 丰满少妇在线观看 | 激情校园亚洲 | 日韩在线观看你懂的 | 免费观看成人av | 99精品视频免费观看视频 | 国产视频在线一区二区 | 国产精品免费久久 | 黄色在线观看免费 | 中文字幕免费看 | 在线国产欧美 | 色婷婷久久久综合中文字幕 | 精品影院 | 日韩色爱| 亚洲毛片在线观看. | 久久国产精品一区二区三区 | 免费视频91蜜桃 | 91精品在线免费视频 | 欧美成年性 | 99免费在线视频 | 人人艹视频 | 亚洲午夜久久久久久久久 | 欧美性一级观看 | 少妇激情久久 | 午夜国产福利在线 | 亚洲欧美综合精品久久成人 | 天天干天天干天天干天天干天天干天天干 | 亚洲免费视频在线观看 | 国产精品99精品久久免费 | 久久中文字幕导航 | 这里有精品在线视频 | 亚洲精品久久久久中文字幕二区 | 91九色国产在线 | 中文字幕日韩国产 | 午夜视频一区二区三区 | 国产精品麻豆果冻传媒在线播放 | 91爱爱视频 | 日产av在线播放 | 久久国产精品99久久久久久进口 | 亚洲在线免费视频 | 色婷婷播放 | 成年人在线视频观看 | 日韩色综合网 | 国产视频在线免费 | 欧美精品一区二区蜜臀亚洲 | 免费涩涩网站 | 97视频网站 | 亚洲国产成人在线观看 | 五月婷在线 | 91黄色影视 | 久久国产精品久久久 | 精品国产人成亚洲区 | 国产精品99精品 | 久草视频免费在线观看 | 夜夜躁狠狠躁 | 在线观看精品国产 | 成年人精品 | 国产精品网红直播 | 国产亚洲精品久久久久久久久久 | 久久久久久久久久久高潮一区二区 | 91免费视频国产 | av在线亚洲天堂 | 色婷婷在线播放 | 国产精品久久久久久模特 | 精品在线观看一区二区 | 国产精品女人久久久久久 | 国产麻豆剧果冻传媒视频播放量 | 日韩中文在线字幕 | 日日干夜夜骑 | 日韩免费一区二区三区 | 四虎国产精品免费 | 亚洲a免费 | 日本字幕网 | 欧美精品久久久久久久久久丰满 | 精品久久毛片 | 精品久久久久久久久久久院品网 | 久久久污| 国产乱对白刺激视频不卡 | 欧美高清成人 | 久久国产网 | 国产精品久久久久9999 | 亚洲精品久久久久久国 | 欧美日韩一区二区三区不卡 | 91资源在线| 97**国产露脸精品国产 | 亚洲经典在线 | 国产美腿白丝袜足在线av | 国产婷婷视频在线 | 蜜桃麻豆www久久囤产精品 | 久久99在线 | 婷婷色在线观看 | 精品久久久久久国产91 | 日韩欧美精品一区二区 | 99精品国产免费久久 | 国产亚洲欧美一区 | 五月天开心 | 国产资源精品在线观看 | 久久综合精品国产一区二区三区 | 天天天天天天操 | 中文字幕国产亚洲 | 亚洲精品在线播放视频 | 久久精品96| 在线天堂中文www视软件 | 国产精品一区二区三区在线看 | 精品高清美女精品国产区 | 天堂av网址 | 成人免费在线电影 | 蜜臀av网站 | 91爱爱视频| 久久一区二区三区国产精品 | 麻豆视频免费版 | 成人高清av在线 | 97电院网手机版 | 中文字幕日本特黄aa毛片 | 四虎成人精品永久免费av九九 | 97超碰在线久草超碰在线观看 | 99久久久成人国产精品 | 日韩最新av| 成人精品视频久久久久 | 国产日韩精品视频 | 18性欧美xxxⅹ性满足 | 国产91在线播放 | 91麻豆看国产在线紧急地址 | 麻豆国产在线视频 | 久久综合久久伊人 | 三级在线视频观看 | 久久xxxx| 色婷婷久久久综合中文字幕 | 国精产品999国精产品视频 | 亚洲国产综合在线 | 91精品国自产在线观看欧美 | 99九九99九九九视频精品 | 久久人人爽人人片av | 91精品国自产在线观看 | 日黄网站 | 日韩精品一区二区三区视频播放 | 99精品久久久久 | 国产不卡在线观看视频 | 免费在线观看国产黄 | 激情影院在线 | 成人免费在线视频观看 | 高清av在线免费观看 | 欧美激情视频一二区 | 日韩欧美在线第一页 | 久久久官网 | 午夜美女福利 | 免费精品久久久 | 亚洲欧美在线观看视频 | 麻豆小视频在线观看 | 亚洲精品高清视频在线观看 | 在线看国产视频 | 91成人小视频 | 91在线入口 | 成人黄大片视频在线观看 | 日韩免费一级a毛片在线播放一级 | 中文字幕乱在线伦视频中文字幕乱码在线 | 天天天色 | 韩日av在线 | 99久久久国产精品免费99 | 日韩欧美在线影院 | 精品久久久久免费极品大片 | 最新色站| 欧美一二三区在线播放 | 狠狠色丁香久久综合网 | 天天综合网~永久入口 | 久久黄页| 在线看国产一区 | 99热在线精品观看 | 午夜精选视频 | 99精品热视频 | 亚洲精品国产电影 | 在线不卡视频 | www.com久久久| 91麻豆精品| 九九在线播放 | 在线蜜桃视频 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 麻豆小视频在线观看 | 中文字幕在线观看播放 | 亚洲伊人婷婷 | 久久综合狠狠 | 热久久在线视频 | 高清在线一区二区 | 中文在线免费一区三区 | 激情视频在线观看网址 | 久久久久亚洲精品男人的天堂 | 91热这里只有精品 | 91av视频在线播放 | 4hu视频| av资源免费在线观看 | 91你懂的 | 国产精品门事件 | 人人玩人人添人人澡97 | 亚洲精品大全 | 色 免费观看 | 三级av片 | 91福利在线观看 | 91精品久久久久久综合乱菊 | 2021久久 | 国产精品日韩久久久久 | 精品黄色片 | 亚洲美女精品区人人人人 | 丁香婷婷激情 | 亚洲精品h | 天天插日日插 | 天天天插 | 欧美日韩不卡一区二区三区 | av网站在线免费观看 | 免费看一级特黄a大片 | 久久综合精品国产一区二区三区 | 97免费在线观看视频 | 久草爱 | 在线视频一二区 | 1区2区3区在线观看 三级动图 | 色播99 | 国产麻豆果冻传媒在线观看 | 91在线看视频 | 伊人婷婷激情 | 国产日韩欧美在线观看视频 | 国产一区在线免费 | 日本精品在线视频 | 成人教育av | 人人玩人人添人人澡超碰 | 久久不卡视频 | av黄色免费网站 | 欧美日本不卡 | 国产精品永久久久久久久久久 | 国产精品久久在线 | 国产理论片在线观看 | 在线中文字幕一区二区 | 国产精品一区二区久久精品爱微奶 | 国产精品成人av在线 | 91香蕉视频黄色 | 国产精品剧情在线亚洲 | 中文字幕在线观看av | 久久久久久久电影 | 九九热国产 | 国产在线观看xxx | 免费看在线看www777 | 人人揉人人揉人人揉人人揉97 | 亚洲一区动漫 | 波多野结衣视频一区 | 99久久视频| 欧美激情视频一区二区三区 | 久草线 | 久久手机免费视频 | 成片免费观看视频大全 | 操一草 | 激情 婷婷| 91视频一8mav| 免费一级毛毛片 | 操操操com| 在线观看麻豆av | 国产在线黄 | 国产高清 不卡 | 亚洲成人av电影在线 | 精品国产电影一区二区 | 美女在线观看av | 国产高清在线a视频大全 | 国产69精品久久久久99尤 | 91九色视频在线播放 | 天天操人 | 日韩精品一区电影 | 欧美日韩视频精品 | 久久男人中文字幕资源站 | 18岁免费看片 | 91视频在线自拍 | 免费日韩三级 | 麻豆精品视频 | 国产区欧美 | 999毛片| 在线观看视频一区二区三区 | 不卡av电影在线 | 波多野结衣视频一区二区三区 | 国产手机在线精品 | 国产日韩精品一区二区在线观看播放 | 丝袜精品视频 | 国产免费观看av | 日韩二级毛片 | 国产精品久久久久影院 | 人人澡人人添人人爽一区二区 | 欧美尹人| 97超碰福利久久精品 | 99精品视频网 | 伊人天天操 | 狠狠网站 | 91精品在线视频观看 | 中文字幕一区二区三区在线观看 | 亚洲精品影视 | 久草在线最新免费 | av理论电影| 欧美日韩中文字幕在线视频 | 国产视频不卡 | 久久公开视频 | 国产91成人在在线播放 | 国产精品一区二区白浆 | 99精品国产在热久久 | 丁香狠狠 | 在线视频观看亚洲 | 国产精品3 | 2019中文字幕网站 | 亚洲成人精品在线观看 | av成人亚洲 | 中文字幕在线视频精品 | 成人av片在线观看 | 国产午夜视频在线观看 | 国产无限资源在线观看 | 久久99久久99精品 | 国产青青青 | 国产91精品高清一区二区三区 | 欧美成人中文字幕 | 91经典在线 | 久久国产一区二区 | 综合色中色 | 国产精品九九久久久久久久 | 免费看日韩 | 奇米四色影狠狠爱7777 | 日韩欧美高清不卡 | 国产精品久久久久久久久久久久 | 久久精品一二三 | 在线日韩精品视频 | 亚洲视频在线看 | 国产精品久久久久影视 | 中文字幕一区二区三区四区 | 久久久久久片 | 国产操在线| 一性一交视频 | 麻豆传媒视频观看 | 午夜精品久久久久久久久久 | 国产精品毛片久久久 | 91福利视频免费 | 久久永久免费视频 | 久久成人18免费网站 | 免费观看成年人视频 | 亚洲蜜桃av | 国产色中涩 | 精品久久网站 | 日本女人的性生活视频 | 国产夫妻性生活自拍 | 少妇bbb| 香蕉视频国产在线 | 九九免费观看全部免费视频 | 日韩美女黄色片 | 91精品国自产在线观看欧美 | 美女又爽又黄 | 九九热在线播放 | 久久99精品久久久久蜜臀 | 亚洲天堂网在线观看视频 | 免费观看完整版无人区 | 国产亚洲一区 | 午夜成人免费影院 | 91亚洲网| 精品综合久久 | 精品一区二区日韩 | 精品免费久久久久 | 91精品在线播放 | 激情综合色图 | 亚洲国产精品一区二区久久hs | 日韩精品在线观看视频 | 欧美日韩精品在线 | 国产美女免费观看 | 欧美性极品xxxx娇小 | 日韩电影一区二区在线观看 | 热久久国产 | 日韩精品一区二区在线 | 成年人电影免费在线观看 | 97国产精品一区二区 | 在线观看成人毛片 | 欧美成天堂网地址 | 日韩毛片在线一区二区毛片 | 青青河边草免费视频 | 国产精品免费观看久久 | 亚洲国产欧美在线人成大黄瓜 | 精品少妇一区二区三区在线 | 麻豆高清免费国产一区 | 97日日碰人人模人人澡分享吧 | 香蕉久草在线 | 国产一区二区手机在线观看 | 日韩av资源站 | 超碰精品在线 | 国产在线观看中文字幕 | 2023av| 免费黄色小网站 | 日韩精品视频在线观看网址 | 丝袜av网站 | 免费视频一二三区 | 色视频成人在线观看免 | 久久久免费av | 欧美伦理一区二区三区 | 国产电影黄色av | 国产精品一区二区三区免费视频 | 久热电影 | 日韩欧美精品在线观看 | 日韩精品一区二区三区电影 | 天天干天天射天天爽 | 91视频成人免费 | 欧美一区日韩精品 | 国产精品美女毛片真酒店 | 五月综合激情 | 中文字幕国产视频 | 日韩在线免费视频观看 | 色综合夜色一区 | 1024在线看片| 国产一区二区三区免费观看视频 | 国产精品欧美久久久久久 | 精品一区二区在线免费观看 | 婷婷激情五月 | 亚洲欧美日韩精品久久久 | 日日干美女| 九九久| 国产精品videoxxxx | 伊人激情综合 | 精品久久1| 在线精品观看 | 免费日韩 精品中文字幕视频在线 | 国产中的精品av小宝探花 | 久草在线国产 | 免费在线h| 欧美在线a视频 | 香蕉视频在线看 | 欧美成人区 | 日韩在线观看的 | 久久69av| 91精品视频在线免费观看 | 久久免费视频7 | 操操操com | 91理论电影| 日本久久久久久久久久久 | 久草在线一免费新视频 | 蜜桃视频在线视频 | 综合色在线 | 精品国产亚洲一区二区麻豆 | 国产一区黄色 | 九九综合九九综合 | 欧美午夜精品久久久久 | 久久久精品一区二区三区 | 久久精品视频播放 | 国产码电影| 99久久精品网 | 国产精品一区在线观看你懂的 | 视频一区在线免费观看 | 中文字幕中文中文字幕 | 黄色在线免费观看网址 | 日韩欧美在线免费观看 | 天天做天天爱天天爽综合网 | 中文字幕在线免费播放 | 日本精品一 | 久久精品xxx | 综合久久久久久久久 | 久久刺激视频 | 丁香av在线 | 特级a老妇做爰全过程 | 久久久久久综合 | 亚洲精品婷婷 | 在线一级片 | 亚洲成人免费在线观看 | 在线成人国产 | 天海冀一区二区三区 | 日韩欧美一区二区三区视频 | 国产亚洲精品久久久久5区 成人h电影在线观看 | aa级黄色大片 | 日韩欧美精品在线 | 啪啪肉肉污av国网站 | 玖玖玖影院| 狠狠干狠狠艹 | 精品国产乱子伦一区二区 | 久久免费国产精品 | 精品国内自产拍在线观看视频 | 久久高清毛片 | 国产成人61精品免费看片 | 久久久国产一区二区三区四区小说 | 亚洲精品乱码 | 亚洲区二区 | 在线播放 日韩专区 | 亚洲免费小视频 | 亚洲春色综合另类校园电影 | 人人揉人人揉人人揉人人揉97 | 色综合a| 午夜精品视频在线 | av中文字幕在线播放 | 久久久久久不卡 | 免费亚洲视频在线观看 | 欧美精品久久久久久久久久丰满 | 成人小视频在线观看免费 | 最新国产视频 | 亚洲欧洲一区二区在线观看 | 日本中文在线播放 | 精品久久久久久久久亚洲 | 日韩中文字幕在线不卡 | 国产第一页在线观看 | 成年人免费观看国产 | 久久你懂得 | 国产精品久久综合 | 国产精品久久久久久妇 | 日本久久电影网 | 综合网中文字幕 | 国外成人在线视频网站 | 国内精品久久久久影院男同志 | 天天操夜夜做 | 日韩久久久久久久久久 | 在线观看视频免费播放 | 人人澡人人添人人爽一区二区 | 国产精品 视频 | 精品一区二区三区在线播放 | 久久亚洲免费 | 亚洲 欧美 日韩 综合 | 欧美日韩免费网站 | 亚洲va欧美va人人爽 | 欧美成人日韩 | 欧洲精品在线视频 | 九九精品视频在线看 | 欧美 日韩 性| 久久久久国产一区二区三区 | 深爱激情开心 | 91黄色小视频 | 国产精品1区2区在线观看 | 久草在线免费色站 | 欧美精品在线观看 | 久久精品艹 | 狠狠ri| 一区二区三区在线免费观看视频 | 国产精品精品视频 | 免费亚洲婷婷 | 亚洲成人xxx| 五月天av在线 | 夜夜骑日日操 | 精品国产一区二区三区四区在线观看 | 日韩免费高清在线 | 久久免费a | 99精品视频免费观看 | 久久久精品福利视频 | 色美女在线 | 久久伊人国产精品 | 午夜精品久久久久久久爽 | 国产精品久久一卡二卡 | 国产精品久久久久aaaa九色 | 天天爽夜夜爽人人爽曰av | 99精品国产福利在线观看免费 | 日韩大片在线 | 欧美日韩激情视频8区 | 日本女人的性生活视频 | 久久精品国产99国产 | 亚洲一二三在线 | 欧美极品少妇xbxb性爽爽视频 | 国产成人精品久久亚洲高清不卡 | 四虎国产精品永久在线国在线 | 免费高清在线观看成人 | 久久久一本精品99久久精品 | 欧美日韩中 | 成人永久在线 | 手机看片1042 | av午夜电影 | 色综合久久精品 | 超碰国产在线观看 | 婷婷久久网站 | 成人免费影院 | 91精品国产欧美一区二区成人 | 亚洲影音先锋 | 九九在线免费视频 | 天天干天天干天天干 | av黄色免费在线观看 | 在线免费国产 | 亚洲永久av| 久久香蕉国产精品麻豆粉嫩av | 久久久久国产视频 | 在线国产中文字幕 | 国产精品久久久久久爽爽爽 | 午夜精品久久久久久久爽 | 日韩在线视频二区 | 黄a在线 | 国产精品国产三级国产不产一地 | 久久久久久久久久久免费 | 91麻豆文化传媒在线观看 | 国产原创中文在线 | 91亚洲永久精品 | 欧美美女激情18p | 日韩中文字幕在线 | 国产一级片播放 | 久久电影中文字幕视频 | 日本在线中文 | 国产亲近乱来精品 | 亚洲一级免费观看 | 国产精品中文在线 | av网站免费看 | 激情综合五月 | 国产精品女人久久久 | 亚洲精品高清视频在线观看 | 美女久久一区 | 久久免费一 | 亚洲第一av在线播放 | 天天艹天天 | 国产精品国产三级国产不产一地 | 国产一级二级三级在线观看 | 国产不卡免费av | 日韩精品免费一区二区在线观看 | 久久精品综合网 | 久久久久成 | 99精品视频在线观看免费 | 午夜色场| 免费看十八岁美女 | 五月天婷婷免费视频 | 国产精品一区二区三区电影 | 国产成a人亚洲精v品在线观看 | 日日草天天干 | 免费看黄色91 | 亚洲国产欧美一区二区三区丁香婷 | 九九热免费在线观看 | 免费看一及片 | 91社区国产高清 | 九九精品视频在线 | 欧美在线观看视频一区二区三区 | 精品国产乱子伦一区二区 | 黄色三级免费看 | 成人黄色小说在线观看 | 综合久色 | 久久久久久久久久久精 | 免费在线成人av电影 | 国产在线观看一 | 欧美 日韩 久久 | 亚洲精品91天天久久人人 | 97在线影院 | 国产网站色 | 午夜av免费在线观看 | 国产又黄又爽又猛视频日本 | 欧美日本啪啪无遮挡网站 | 三级黄色理论片 | 人人插人人看 | 久久久久久久久久久黄色 | 欧美极品少妇xxxx | 中字幕视频在线永久在线观看免费 | 久一网站 | 天天综合网~永久入口 | 鲁一鲁影院 | 99这里精品| 免费av在线网站 | 免费亚洲电影 | 日韩在线视频播放 | 国产精品 日韩 | 午夜精品久久久久久久久久久久 | 九九热精品视频在线观看 | 中文字幕在线观看第一页 | 国产不卡视频在线 | 久久久久久久影视 | 香蕉视频在线免费看 | 亚洲精品人人 | 国产精品乱码一区二区视频 | 色吊丝在线永久观看最新版本 | 国产成人在线观看免费 | 香蕉视频亚洲 | 99久久夜色精品国产亚洲96 | 97狠狠干| 免费在线色视频 | 久久综合导航 | 亚洲jizzjizz日本少妇 | 99免在线观看免费视频高清 | 日韩精品中文字幕有码 | 欧美夫妻生活视频 | 欧美91成人网 | 欧美一二三视频 | 国产成本人视频在线观看 | 99草在线视频 | 国产精品国产三级在线专区 | 国产精品久久久久久久免费观看 | 亚洲黄色区 | 国产一区二区三区在线免费观看 | 天天人人 | 中文字幕中文字幕在线一区 | 中文字幕在线观看资源 | 99久久国产免费,99久久国产免费大片 | 久久视频在线免费观看 | 黄色免费视频在线观看 | 日韩精品一二三 | 国产精品免费在线观看视频 | 99中文字幕在线观看 | 国产一区二区高清视频 | 久草在线看片 | 欧美aa级 | 一区电影 | 色吊丝在线永久观看最新版本 | 中文字幕久久网 | 国产成在线观看免费视频 | 国产精品永久久久久久久久久 | 婷婷丁香激情综合 | 在线亚洲观看 | 人人爱人人做人人爽 | 亚洲影院国产 | 国产999精品 | 视频在线观看99 | 久久亚洲免费视频 | 久久精品中文字幕少妇 | 亚洲a网 | 91成人免费看 | 久久久久夜色 | 国产一区在线视频 | 天天爽综合网 | 日韩大片在线看 | 久久av网 | 午夜精品中文字幕 | av天天澡天天爽天天av | 久久国产一二区 | 久久精品网站视频 | 日韩av午夜在线观看 | 日韩av有码在线 | 久久国产亚洲 | 在线观看www视频 | 久久免费在线观看视频 | 久久97精品| 九色精品免费永久在线 | 欧美成人日韩 | 亚洲第五色综合网 | 麻豆免费精品视频 | 亚洲一区久久 | 日韩av不卡播放 | 日韩婷婷 | 麻豆视频免费播放 | 国产黄影院色大全免费 | 亚洲综合在线五月天 | 成人一区二区在线 | 久久成年视频 | 人人干在线 | 亚洲精品美女久久久久网站 | 久久久污 | 久久综合在线 | 成人影片在线免费观看 | 99视频在线精品国自产拍免费观看 | 亚洲精品高清一区二区三区四区 | 视频二区在线视频 | 狂野欧美激情性xxxx欧美 | 97福利| 亚洲 欧美 成人 | 99免费在线观看 | 国产成人精品午夜在线播放 | 一本一道久久a久久综合蜜桃 | 亚洲精品xxx | 毛片99 | free. 性欧美.com | 婷婷久久一区 | 日韩精品一区二区三区中文字幕 | 久操视频在线播放 | 亚洲视频精品 | 蜜桃视频日韩 | 六月丁香综合网 | 日本三级在线观看中文字 | 亚洲激情校园春色 | 天天人人| 久久精品中文字幕免费mv | 国产亚洲精品久久网站 | 国产自产高清不卡 | 国产精品高潮在线观看 | 久久久电影网站 | 天天综合婷婷 | 亚洲一区二区麻豆 | 国产精品美女www爽爽爽视频 | 日韩高清观看 | 日韩69视频 | av免费网站在线观看 | 免费av高清 | 久久久久久免费网 | 久久精品视频在线免费观看 | 亚洲免费av网站 | 精品国产一区二区三区蜜臀 | 东方av在 | 992tv在线 | 插婷婷 | 久久99精品国产99久久6尤 | 在线看日韩av | 亚洲性少妇性猛交wwww乱大交 | 国产精品国产三级国产不产一地 | 特黄免费av | 久久精品国产精品亚洲 | 黄网在线免费观看 | 免费视频成人 | 一本一道久久a久久综合蜜桃 | 天海冀一区二区三区 | 麻豆av电影| 日韩高清成人 | 久久免费视频在线观看30 | 亚洲综合色视频 | 亚洲视频 一区 | 欧美做受高潮1 | 精品久久久99 | 日日麻批40分钟视频免费观看 | 97人人模人人爽人人喊网 | 日韩在线观看视频在线 | 丁香婷婷综合激情 | 色噜噜噜 | 99久久精品久久久久久动态片 | 国产精品久久久久永久免费看 | .国产精品成人自产拍在线观看6 | 国产精品丝袜在线 | 97电影手机版 | 97精品国产97久久久久久久久久久久 | 国产精品久久久久久久久免费看 | 免费的黄色av | 欧美性大战久久久久 | 亚洲成人免费在线观看 | www最近高清中文国语在线观看 | 久久国产精品一区二区三区四区 | 激情欧美xxxx | 国产精品久久久久久久电影 | 偷拍久久久 | 欧美另类xxxxx | 少妇搡bbbb搡bbb搡69 | 91麻豆精品国产午夜天堂 | 最近中文字幕在线播放 | 国产精品精品久久久久久 | 免费在线观看污 | 中文字幕不卡在线88 | 婷婷久久一区 | 大型av综合网站 | 91秒拍国产福利一区 | 超碰在线94| 在线综合 亚洲 欧美在线视频 | 成人九九视频 | 正在播放一区二区 | 涩涩在线| 久精品视频 | 91污在线 | 人人看人人艹 | www蜜桃视频 | 激情五月婷婷网 | 精品字幕 | 午夜视频久久久 | 少妇18xxxx性xxxx片 | 中文字幕一区二区三区久久蜜桃 | 在线欧美日韩 | 日韩欧美网站 | 亚洲国产天堂av | 在线观看黄色的网站 | 日韩在线电影一区二区 | 日本在线观看视频一区 | 国产精品婷婷午夜在线观看 | 久久久999精品视频 国产美女免费观看 | 九七人人干 | 久久精品日产第一区二区三区乱码 | 中文字幕免费高清在线 | 狠狠色丁香婷婷综合最新地址 | 五月天丁香 | 亚洲视频久久久久 | 麻豆av一区二区三区在线观看 | 亚洲综合视频在线 | 免费在线观看一区二区三区 | 亚洲精品在线免费观看视频 | 在线观看精品黄av片免费 | 日韩理论片 | 久久国色夜色精品国产 | 日韩欧美视频免费在线观看 | 欧美美女视频在线观看 | 久久国产美女 | 99久久精品国产一区二区成人 | 国产精品毛片久久久久久久 | 开心综合网 | 麻豆精品传媒视频 | 欧美精品乱码久久久久久按摩 | 综合国产视频 | 香蕉视频国产在线观看 | 狠狠操狠狠操 | 激情综合色综合久久 | 久久这里| 国产精品伦一区二区三区视频 | 国产91欧美| 岛国av在线不卡 | 欧美在线视频精品 | 国产精品第10页 | 开心激情网五月天 | 欧美日韩在线第一页 | 黄色亚洲 | 国产精品一级在线 | 国产精品av在线免费观看 | 久久精品五月 | 午夜精品一区二区三区在线观看 | avove黑丝 | 国内精品国产三级国产aⅴ久 | 精品在线视频观看 | 日韩免费观看一区二区 | 麻豆免费在线视频 | 中文字幕免费不卡视频 | 中文字幕在线播放一区二区 | avsex| 亚洲精品ww | 日本黄色免费在线观看 | 日韩中文字幕视频在线 | 黄色一级大片在线免费看国产一 | 天天射天天艹 | 色99视频 | 国产欧美久久久精品影院 | 欧亚久久| 亚洲国产中文字幕在线 | 91九色在线| 丁香激情综合 | 久免费视频 | 亚州日韩中文字幕 | av黄色免费看 | 丁香五婷| 四虎影视8848aamm | 日韩黄视频 | www免费网站在线观看 | 在线免费观看麻豆视频 | 四虎影视成人精品 | 久久成人午夜视频 | 丁香婷婷激情网 | 欧美日韩性 | 欧美精品一区二区三区一线天视频 |