i.MX6ULL嵌入式Linux開發1-uboot移植初探

      網友投稿 894 2025-03-31

      本系列教程以i.MX6ULL處理器的ARM開發板為實驗基礎,學習記錄嵌入式Linux開發的各種知識與經驗,主要內容包括嵌入式Linux移植,嵌入式Linux驅動開發,嵌入式Linux應用開發等。

      本系列教程將以野火的i.MX6ULL eMMC開發板為硬件基礎,以野火EBF6ULL Pro開發板教程和正點原子i.MX6ULL阿爾法開發板教程為參考,進行學習實踐。

      1 嵌入式Linux移植概述

      Linux 的移植主要包括3部分:

      移植bootloader 代碼, Linux 系統要啟動就必須需要一個 bootloader 程序,也就說芯片上電以后先運行一段bootloader程序。 這段bootloader程序會先初始化DDR等外設, 然后將Linux內核從flash(NAND,NOR FLASH,SD,MMC 等)拷貝到 DDR 中,最后啟動 Linux 內核。 bootloader 有很多,常用的就是 U-Boot。

      bootloader 和 Linux 內核的關系就跟 PC 上的 BIOS 和 Windows 的關系一樣,bootloader 就相當于 BIOS。

      移植Linux 內核,Linux內核由一系列程序組成,包括負責響應中斷的中斷服務程序、負責管理多個進程從而分享處理器時間的調度程序、負責管理地址空間的內存管理程序、網絡、進程間通信的系統服務程序等。內核負責管理系統的硬件設備。

      移植根文件系統(rootfs),Linux 中的根文件系統更像是一個文件夾或者叫做目錄,在這個目錄里面會有很多的子目錄。根目錄下和子目錄中會有很多的文件,這些文件是 Linux 運行所必須的,比如庫、常用的軟件和命令、設備文件、配置文件等等。根文件系統里面包含了一些最常用的命令和文件。

      U-Boot、Linux kernel 和 rootfs這三者一起構成了一個完整的 Linux 系統,一個可以正常使用、功能完善的 Linux 系統。

      2 實驗開發板簡介

      本測試使用的開發板為野火的i.MX6ULL eMMC開發板。

      3 U-Boot簡介

      uboot 的全稱是Universal Boot Loader,遵循 GPL 協議的開源軟件。

      uboot 是一個裸機代碼,可以看作是一個裸機綜合例程。現在的 uboot 已經支持液晶屏、網絡、USB 等高級功能。uboot 官網為 https://www.denx.de/wiki/U-Boot/

      可以在uboot官網下載uboot源碼,點擊左側 Topics 中的“Source Code”,然后點擊的“FTP Server” ,進入其 FTP 服務器即可看到 uboot 源碼。

      但我們移植uboot時一般不會直接用 uboot 官方的源碼的,官方的源碼是給半導體廠商準備的,半導 體廠商會根據自家的芯片,維護自己芯片對應的uboot。

      NXP(freescale)維護的的uboot地址: https://github.com/Freescale/u-boot-fslc

      4 NXP uboot測試

      uboot移植并不需要從零開始將 uboot 移植到我們現在所使用的開發板上。因為半導體廠商通常都會自己做一個開發板(原廠開發板), 將uboot移植到他們自己的原廠開發板上,再將這個uboot(原廠BSP 包)發布出去。

      市面上的開發板,通常會參考原廠的開發板做硬件,然后在原廠提供的 BSP 包上做修改,如正點原子和野火的 I.MX6ULL 開發板參考的就是NXP官方的 I.MX6ULL EVK 開發板做的硬件:

      4.1 編譯環境搭建

      4.1.1 交叉編譯器下載

      嵌入式Linux開發,程序編譯通常在電腦端的Linux(如虛擬機中的Ubuntu)下進行編譯,Ubuntu 自帶gcc 編譯器,但該編譯器是針對 X86 架構的!而嵌入式Linux是ARM架構的, 所以需要一個在 X86 架構上可以編譯 ARM 架構代碼的 gcc編譯器,即交叉編譯器。

      交叉編譯器有很多,本實驗使用 Linaro 出品的交叉編譯器,-:

      https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/

      4.1.2 交叉編譯器安裝

      在Ubuntu中創建目錄:/usr/local/arm,并將下載的gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz復制到此文件中,然后解壓,解壓命令如下:

      sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

      解壓完成以后會生成一個名為“gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf”的文件夾,這個文件夾里面就是我們的交叉編譯工具鏈。

      然后,需要將該目錄添加到環境變量中。打開/etc/profile 以后,在最后面輸入如下所示內容:

      export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

      使用交叉編譯器之前還需要安裝其它的庫,命令如下:

      sudo apt-get install lsb-core lib32stdc++6

      安裝完之后,可以查看交叉編譯工具的版本號,輸入如下命令:

      arm-linux-gnueabihf-gcc -v

      可以看到類似如下打印

      以看出當前交叉編譯器的版本號為 4.9.4,說明交叉編譯工具鏈安裝成功。

      4.2 編譯原廠uboot

      編譯前還要在Ubuntu 中安裝ncurses 庫,安裝命令如下:

      sudo apt-get install libncurses5-dev

      在Ubuntu中創建存放uboot的目錄,如我的目錄是:/home/xxpcb/myTest/imx6ull/uboot/nxp_uboot

      然后,將NXP(freescale)的uboot源碼復制進來,這里使用的是正點原子提供的NXP官方原版Uboot源碼包( uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2)

      然后進行解壓:

      i.MX6ULL嵌入式Linux開發1-uboot移植初探

      tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

      解壓后的源碼文件如下:

      首先看下uboot的配置,configs 目錄下有很多跟 I.MX6UL/6ULL 有關的配置,找到與mx6ull相同的,如下圖。

      因為我這個開發板是emmc版本的,所有就使用這個mx6ull_14x14_evk_emmc_defconfig。

      編譯uboot使用下面3條指令:

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

      這3條命令中 :

      ARCH=arm 設置目標為 arm 架構

      CROSS_COMPILE 指定所使用的交叉編譯器。

      第1條命令相當于make distclean,目的是清除工程,一般在第一次編譯的時候最好清理一下工程。

      第2條指令相當于make mx6ull_14x14_evk_emmc_defconfig ,用于配置 uboot,配置文件為 mx6ull_14x14_evk_emmc_defconfig。

      第3條指令相當于make -j8,也就是使用8核來編譯uboot。

      為了方便的執行著3條指令,可以將這些指令寫成shell腳本,比如在uboot源碼目錄下新建一個build.sh文件,寫入如下內容:

      #!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

      然后進行編譯:

      ./build.sh

      編譯完成以后uboot 源碼多了一些文件,其中u-boot.bin就是編譯出來的 uboot二進制文件。 uboot是個裸機程序, 因此需要在其前面

      加上頭部(IVT、 DCD等數據)才能在I.MX6U上執行,u-boot.imx文件就是添加頭部以后的 u-boot.bin。

      u-boot.imx 就是我們最終要燒寫到開發板中的 uboot 鏡像文件。

      4.3 燒錄開發板

      這是的燒錄開發板,實際是要燒錄到SD卡中,然后將SD卡插入開發板,讓開發板從SD卡啟動(需要在開發板上設置撥碼開關來選擇啟動方式)。

      4.3.1 燒錄到SD卡

      正點原子專門編寫了一個小軟件用來將編譯出來的.bin 文件燒寫到 SD 卡中,這個軟件叫做“imxdownload”

      將imxdownload 復制到 Ubuntu 中的uboot源碼文件夾,再使用如下指令,給予 imxdownload 可執行權限:

      chmod 777 imxdownload

      然后電腦USB中插入SD卡(讀卡器),并在虛擬機中設置usb加載(VMware或VirtualBox虛擬機需要先安裝增強功能才能使用)

      然后可以使用如下指令來查看SD卡的掛載標識符:

      ls /dev/sd*

      查看輸出結果:

      這里的/dev/sdb就是我的SD卡。

      注:我第一次使用SD卡燒錄時,只多出了/dev/sdb,但不知什么情況,用了幾次后,再插入SD卡,就會同時多出來/dev/sdb和/dev/sdb1,但實際測試,仍然把程序燒錄到/dev/sdb也能用)。

      imxdownload向SD卡燒寫led.bin文件,命令格式如下:

      ./imxdownload u-boot.bin /dev/sdb

      注意不能燒寫到/dev/sda或sda1設備里面!那是系統磁盤。

      燒寫過程會輸入如下信息:

      燒寫的最后一行會顯示燒寫大小、用時和速度,比如u-boot.bin燒寫到SD卡中的大小是 423KB,用時 1.7s,燒寫速度是 236KB/s。

      注意這個燒寫速度,如果這個燒寫速度在幾百KB/s 以下那么就是正常燒寫。 如果這個燒寫速度大于幾十MB/s、甚至幾百MB/s那么肯定是燒寫失敗了! 重新插拔/格式化SD卡或重啟ubuntu再試。

      燒寫完成以后會在當前工程目錄下生成一個load.imx的文件,這個文件就是軟件 imxdownload 根據 NXP 官方啟動方式介紹的內容, 在 bin 文件前面添加了一些數據頭以后生成的。最終燒寫到 SD卡里面的就是這個imx文件。

      4.3.2 啟動開發板

      燒錄完之后,將SD卡插入開發板啟動,使用串口連接電腦,查看uboot啟動信息。

      設置好串口參數(波特率115200)并打開,按鍵復位開發板。

      當串口打印上出現“Hit any key to stop autoboot”倒計時的時候按下鍵盤上的回車鍵,默認是 3 秒倒計時,在 3 秒倒計時結束以后如果沒有按下回車鍵的話 uboot 就會使用默認參數來啟動 Linux 內核了。

      如果在 3 秒倒計時結束之前按下回車鍵,那么就會進入 uboot 的命令行模式:

      解讀一下這些信息的含義:

      第1行是 uboot 版本號和編譯時間:當前的 uboot 版本號是 2016.03,編譯時間是 2021/7 /11/15:22:25

      第3、4 行是 CPU 信息:當前使用的 CPU 是飛思卡爾(屬于NXP)的 I.MX6ULL (頻率為 792MHz),此時運行在 396MHz。這顆芯片是工業級的,結溫為-40°C~105°C

      第 5 行是復位原因:I.MX6ULL 芯片上有個 POR_B 引腳,將這個引腳拉低即可復位 I.MX6ULL。

      第 6 行是板子名字,“MX6ULL 14x14 EVK”即NXP原廠開發板的名字 。

      第 7 行提示 I2C 準備就緒。

      第 8 行提示當前板子的DRAM(內存) 為 512MB

      第 9 行提示當前有兩個MMC/SD 卡控制器:FSL_SDHC(0)和 FSL_SDHC(1)。I.MX6ULL支持兩個 MMC/SD,正點原子的 I.MX6ULL EMMC 核心板上 FSL_SDHC(0)接的 SD(TF)卡,FSL_SDHC(1)接的 EMMC。

      第10行是一條警告信息,先忽略。

      第 12、13 行是 LCD 型號,原廠默認的是TFT43AB (480x272)。

      第 14~16 是標準輸入、標準輸出和標準錯誤所使用的終端,這里都使用串口(serial)作為終端。

      第 17 、18行是切換到emmc的第0個分區上,因為當前的 uboot 是 emmc 版本的,也就是從 emmc 啟動的。我們只是為了方便將其燒寫到了 SD 卡上,但是它的“內心”還是 EMMC的。所以 uboot 啟動以后會將 emmc 作為默認存儲器 。

      第 19行是網口信息,提示我們當前使用的 FEC1 這個網口,I.MX6ULL 支持兩個網口。

      第 20行提示 FEC1 網卡地址沒有設置(后面我們會講解如何在uboot 里面設置網卡地址)。

      第 22行提示正常啟動, 也就是說 uboot要從emmc里面讀取環境變量和參數信息啟動 Linux內核了。

      第23行是倒計時提示,默認倒計時 3 秒,倒計時結束之前按下回車鍵就會進入 Linux 命令行模式。如果在倒計時結束以后沒有按下回車鍵,那么 Linux 內核就會啟動,Linux 內核一旦啟動,uboot 就運行結束了。

      第23行是在倒計時 3 秒內按了回車鍵,符號=>表示可以繼續與uboot進行命令交互。

      看過了串口的uboot信息,再來看一下板子是實際運行情況:

      由于原廠的uboot驅動的屏幕是TFT43AB (480x272),與我這里屏幕不一樣,所以屏幕沒有正常顯示(現在的屏幕看起來有許多彩色的小點點),接下來,就是對uboot進行屏幕驅動的修改。

      在本篇結束之前,再來研究一下uboot的串口指令。

      4.4 uboot命令初探

      上面說道,在uboot啟動的3 秒倒計時內,串口界面如果按下了回車鍵,uboot就會輸出符號=>,則可以繼續與uboot進行命令交互。那可以輸入哪些命令呢?

      4.4.1 help命令查看所有指令

      輸入help或者? ,然后按下回車即可查看當前 uboot 所支持的命令:

      => help ? - alias for 'help' base - print or set address offset bdinfo - print Board Info structure bmode - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4 [noreset] bmp - manipulate BMP image data boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BOOTP/TFTP protocol bootvx - Boot vxWorks from an ELF image bootz - boot Linux zImage image from memory clocks - display clocks clrlogo - fill the boot logo area with black cmp - memory compare coninfo - print console devices and information cp - memory copy crc32 - checksum calculation dcache - enable or disable data cache dhcp - boot image via network using DHCP/TFTP protocol dm - Driver model low level access echo - echo args to console editenv - edit environment variable env - environment handling commands erase - erase FLASH memory exit - exit script ext2load- load binary file from a Ext2 filesystem ext2ls - list files in a directory (default /) ext4load- load binary file from a Ext4 filesystem ext4ls - list files in a directory (default /) ext4size- determine a file's size ext4write- create a file in the root directory false - do nothing, unsuccessfully fatinfo - print information about filesystem fatload - load binary file from a dos filesystem fatls - list files in a directory (default /) fatsize - determine a file's size fdt - flattened device tree utility commands flinfo - print FLASH memory information fstype - Look up a filesystem type fuse - Fuse sub-system go - start application at address 'addr' gpio - query and control gpio pins help - print command description/usage i2c - I2C sub-system icache - enable or disable instruction cache iminfo - print header information for application image imxtract- extract a part of a multi-image itest - return true/false on integer compare load - load binary file from a filesystem loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line loadx - load binary file over serial line (xmodem mode) loady - load binary file over serial line (ymodem mode) loop - infinite loop on address range ls - list files in a directory (default /) md - memory display mdio - MDIO utility commands mii - MII utility commands mm - memory modify (auto-incrementing address) mmc - MMC sub system mmcinfo - display MMC info mtest - simple RAM read/write test mw - memory write (fill) nfs - boot image via network using NFS protocol nm - memory modify (constant address) ping - send ICMP ECHO_REQUEST to network host pmic - PMIC printenv- print environment variables protect - enable or disable FLASH write protection reset - Perform RESET of the CPU run - run commands in an environment variable save - save file to a filesystem saveenv - save environment variables to persistent storage setenv - set environment variables setexpr - set environment variable as the result of eval expression sf - SPI flash sub-system showvar - print local hushshell variables size - determine a file's size sleep - delay execution for some time source - run script from memory test - minimal test like /bin/sh tftpboot- boot image via network using TFTP protocol true - do nothing, successfully usb - USB sub-system usbboot - boot from USB device version - print monitor, compiler and linker version =>

      4.4.2 查看指令的使用說明

      命令的具體使用方法,可以輸入help 命令名或? 命令名查看,以“bootz”這個命令為例:

      => help bootz bootz - boot Linux zImage image from memory Usage: bootz [addr [initrd[:size]] [fdt]] - boot Linux zImage stored in memory The argument 'initrd' is optional and specifies the address of the initrd in memory. The optional argument ':size' allows specifying the size of RAW initrd. When booting a Linux kernel which requires a flat device-tree a third argument is required which is the address of the device-tree blob. To boot that kernel without an initrd image, use a '-' for the second argument. If you do not pass a third a bd_info struct will be passed instead =>

      4.4.3 信息查詢命令

      常用的和信息查詢有關的命令有 3 個:bdinfo、printenv和 version。

      bdinfo 板子信息

      => bdinfo arch_number = 0x00000000 boot_params = 0x80000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x20000000 eth0name = FEC1 ethaddr = (not set) current eth = FEC1 ip_addr = baudrate = 115200 bps TLB addr = 0x9FFF0000 relocaddr = 0x9FF47000 reloc off = 0x18747000 irq_sp = 0x9EF44EA0 sp start = 0x9EF44E90 FB base = 0x00000000 =>

      從打印信息可以得出 DRAM 的起始地址和大小、啟動參數保存起始地址、波特率、sp(堆棧指針)起始地址等信息.

      printenv 打印環境變量

      => printenv baudrate=115200 board_name=EVK board_rev=14X14 boot_fdt=try bootcmd=run findfdt;mmc dev ${mmcdev};mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; thn run mmcboot; else run netboot; fi; fi; else run netboot; fi bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr}; bootdelay=3 bootscript=echo Running bootscript from mmc ...; source console=ttymxc0 ethact=FEC1 ethprime=FEC fdt_addr=0x83000000 fdt_file=undefined fdt_high=0xffffffff findfdt=if test $fdt_file = undefined; then if test $board_name = EVK && test $board_rev = 9X9; then setenv fdt_file imx6ull-9x9-evk.dtb; fi; if tst $board_name = EVK && test $board_rev = 14X14; then setenv fdt_file imx6ull-14x14-evk.dtb; fi; if test $fdt_file = undefined; then echo WARNING:Could not determine dtb to use; fi; fi; image=zImage initrd_addr=0x83800000 initrd_high=0xffffffff ip_dyn=yes loadaddr=0x80800000 loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script}; loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file} loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image} mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.file=fat g_mass_storage.ro=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" clk_ignore_unused mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot} mmcautodetect=yes mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} -${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi; mmcdev=0 mmcpart=1 mmcroot=/dev/mmcblk0p2 rootwait rw netargs=setenv bootargs console=${console},${baudrate} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp netboot=echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${imag}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then bootz ${loadaddr} - ${fdt_addr}; else if est ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi; panel=TFT43AB script=boot.scr Environment size: 2431/8188 bytes =>

      這里有很多的環境變量, 比如baudrate、 board_name、 board_rec、 boot_fdt、 bootcmd等。比如 bootdelay 這個環境變量就表示 uboot 啟動延時時間,默認 bootdelay=3,也就默認延時 3秒。前面說的 3 秒倒計時就是由 bootdelay 定義的。另外uboot 中的環境變量都是字符串。

      version 版本信息

      => version U-Boot 2016.03 (Jul 11 2021 - 15:22:25 +0800) arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4 GNU ld (Linaro_Binutils-2017.01) 2.24.0.20141017 Linaro 2014_11-3-git =>

      當前uboot 版本號為 2016.03,編譯日期2021/7/11,編譯器為arm-linux-gnueabihf-gcc。

      本篇uboot移植初探(原廠uboot燒錄測試)就到這里,下一篇進行實際的uboot移植,使得uboot與所用的開發板匹配。

      Linux Ubuntu 嵌入式 軟件開發

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:設置Word2019文檔訪問權限的方法
      下一篇:Git 與 SVN 區別
      相關文章
      国产AV无码专区亚洲Av| 久久久青草青青国产亚洲免观| 亚洲啪啪综合AV一区| 国产亚洲人成在线播放| 亚洲精品无码高潮喷水A片软| 亚洲中文字幕日本无线码| 亚洲一区二区三区在线| 亚洲av午夜精品无码专区| 亚洲短视频在线观看| 亚洲精品自拍视频| 77777_亚洲午夜久久多人| 久久久久亚洲精品天堂| 久久亚洲国产精品成人AV秋霞| 久久久久亚洲AV无码网站| 亚洲狠狠综合久久| 久久水蜜桃亚洲av无码精品麻豆| 亚洲综合久久1区2区3区| 在线观看亚洲人成网站| 亚洲一级视频在线观看| 亚洲中文字幕无码一去台湾| 亚洲熟女综合一区二区三区| 亚洲aⅴ无码专区在线观看春色 | 337P日本欧洲亚洲大胆精品| 亚洲av无码专区首页| 亚洲精品乱码久久久久久不卡| 亚洲午夜福利精品久久| 国产国拍精品亚洲AV片| 亚洲爆乳无码一区二区三区| 亚洲久本草在线中文字幕| 亚洲精品国产啊女成拍色拍| 亚洲不卡视频在线观看| 亚洲av无码成人精品区一本二本| 五月天婷亚洲天综合网精品偷| 亚洲一区精品伊人久久伊人| 亚洲熟妇av一区二区三区| 亚洲av无码国产精品色午夜字幕| 1区1区3区4区产品亚洲| 激情亚洲一区国产精品| 大桥未久亚洲无av码在线| 亚洲性日韩精品一区二区三区| 亚洲精品乱码久久久久久|