国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - OpenHarmony3.0的樹莓派4B移植-學習記錄

OpenHarmony3.0的樹莓派4B移植-學習記錄

2021-12-31 23:23鴻蒙社區hazhuzhu哈豬豬 編程技術

以下是學習 OpenHarmony3.0 樹莓派4B移植的詳細流程記錄,實現了觸摸與顯示,并添加了物理按鍵關機的功能。希望能給像我一樣第一次接觸移植的嵌入式小白以幫助。

OpenHarmony3.0的樹莓派4B移植-學習記錄

前言

以下是學習 OpenHarmony3.0 樹莓派4B移植的詳細流程記錄,主要參考:官方移植指南,官方樹莓派3B移植,社區大佬樹莓派4B移植,LineageOS 樹莓派移植項目:lineage-rpi,Android 樹莓派移植項目:android-rpi。

實現了觸摸與顯示,并添加了物理按鍵關機的功能。希望能給像我一樣第一次接觸移植的嵌入式小白以幫助。

以下步驟操作于 Ubuntu 20.04 LTS 。OHOS 3.0 LTS 源碼解壓自官方鏡像(使用 repo下載得到的最新源碼有較多變化,以下步驟不再適用)。設項目根目錄名為 OpenHarmony,且控制臺默認處于該目錄。移植系統為OHOS標準版 (standard),內核為 Linux-5.10。

定義開發板

根據官方移植手冊,對源碼目錄以及代碼中常出現的幾個概念進行解釋,并在本流程背景下進行賦值:

OpenHarmony3.0的樹莓派4B移植-學習記錄

因此,我們首先定義 SOC。建立文件 OpenHarmony/productdefine/common/device/bcm2711.json:

  1. {
  2. "device_name": "bcm2711",
  3. "device_company": "brcm",
  4. "target_os": "ohos",
  5. "target_cpu": "arm",
  6. "kernel_version": "",
  7. "device_build_path": "device/brcm/build"
  8. }

目前 OHOS 只支持 arm。

接著定義產品。建立文件 OpenHarmony/productdefine/common/products/rpi4.json:

  1. {
  2. "product_name": "rpi4",
  3. "product_company": "raspberry",
  4. "product_device": "bcm2711",
  5. "version": "2.0",
  6. "type": "standard",
  7. "product_build_path": "device/brcm/build",
  8. "parts": {
  9. ...
  10. "brcm_products:brcm_products":{},
  11. ...
  12. }
  13. }

其中,… 部分照搬同目錄下的 Hi3516DV300.json,并將其中的 "hisilicon_products:hisilicon_products":{},改為 "brcm_products:brcm_products":{},。

brcm_products 代表內核構建的子系統。我們需要在 OpenHarmony/build/subsystem_config.json 中定義它,加入鍵值對:

  1. "brcm_products":{
  2. "project": "hmf/brcm_products",
  3. "path": "device/brcm/bcm2711/build",
  4. "name": "brcm_products",
  5. "dir": "device/brcm"
  6. },

建立編譯配置組件

接著在 OpenHarmony/device 下仿照 ./hisilicon/hi3516dv300 建立編譯配置組件。目錄結構:

  1. device
  2. └── brcm
  3. ├── bcm2711
  4. │ ├── build
  5. │ │ └── rootfs
  6. │ │ ├── BUILD.gn
  7. │ │ └── init.rpi4.cfg
  8. │ └── BUILD.gn
  9. └── build
  10. ├── BUILD.gn
  11. └── ohos.build

OpenHarmony/device/brcm/bcm2711/build/rootfs/BUILD.gn

  1. import("//build/ohos.gni")
  2.  
  3. ohos_prebuilt_etc("init.rpi4.cfg") {
  4. source = "init.rpi4.cfg"
  5. install_images = [ "system" ]
  6. part_name = "brcm_products"
  7. }
  8.  
  9. group("init_configs") {
  10. deps = [
  11. ":init.rpi4.cfg"
  12. ]
  13. }

OpenHarmony/device/brcm/bcm2711/build/rootfs/init.rpi4.cfg

OpenHarmony/device/hisilicon/hi3516dv300/build/rootfs/init.Hi3516DV300.cfg

OpenHarmony/device/brcm/bcm2711/BUILD.gn

  1. import("//build/ohos.gni")
  2.  
  3. print("bcm2711_group in")
  4. group("bcm2711_group") {
  5. deps = [
  6. "build/rootfs:init_configs",
  7. "//kernel/linux/build:linux_kernel"
  8. ]
  9. }

OpenHarmony/device/brcm/build/BUILD.gn

  1. import("//build/ohos.gni")
  2.  
  3. group("products_group") {
  4. deps = [
  5. "//device/brcm/bcm2711:bcm2711_group"
  6. ]
  7. }

OpenHarmony/device/brcm/build/ohos.build

  1. {
  2. "subsystem": "brcm_products",
  3. "parts": {
  4. "brcm_products": {
  5. "module_list": [
  6. "//device/brcm/build:products_group"
  7. ]
  8. }
  9. }
  10. }

內核移植

內核編譯流程

首先閱讀 OpenHarmony/kernel/linux/build/kernel.mk

  1. $(KERNEL_IMAGE_FILE):
  2. $(hide) echo "build kernel..."
  3. $(hide) rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfL $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/
  4. $(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(HDF_PATCH_FILE) && patch -p1 -s -N < $(DEVICE_PATCH_FILE)
  5. ifneq ($(findstring $(BUILD_TYPE), small),)
  6. $(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(SMALL_PATCH_FILE)
  7. endif
  8. $(hide) cp -rf $(KERNEL_CONFIG_PATH)/. $(KERNEL_SRC_TMP_PATH)/
  9. $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) distclean
  10. $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(DEFCONFIG_FILE)
  11. ifeq ($(KERNEL_VERSION), linux-5.10)
  12. $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_prepare
  13. endif
  14. $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 uImage
  15. endif

了解到內核編譯的流程:

  1. 刪除 out(編譯輸出目錄)下之前編譯過的內核源碼,重新復制一份 Linux 內核源碼OpenHarmony/kernel/linux/linux-5.10 到 OpenHarmony/out/KERNEL_OBJ/kernel/src_tmp/linux-5.10 下。
  2. 對內核源碼打補丁,包括內核源碼補丁與 HDF 補丁。補丁需要預先準備。
  3. 復制 defconfig,需要預先準備。
  4. make distclean, xxx_defconfig, modules_prepare, uImage.

生成 patch

因此首先準備樹莓派4B需要的內核補丁:

選擇樹莓派官方內核 rpi-5.10.y 來生成內核源碼補丁。設控制臺處在項目根目錄 OpenHarmony 下,依次執行:

  1. mkdir ../rpi-kernel && cd $_
  2. git clone git://github.com/raspberrypi/linux -b rpi-5.10.y --depth=1
  3. cd ../OpenHarmony/kernel/linux
  4. diff -uNr linux-5.10/ /home/username/Project/RPI/rpi-kernel/linux/ > bcm2711.patch
  5. mkdir patches/linux-5.10/bcm2711_patch && cp bcm2711.patch $_ && cd $_
  6. cp ../hi3516dv300_patch/hdf.patch ./

注意 diff 命令:

由于 kernel.mk 中用的是 patch -p1,即忽略掉路徑的第一部分,因此 diff 需作用在 OHOS 自帶的源碼目錄外。

樹莓派官方內核源碼需要用絕對路徑,因人而異。

實際編譯時很可能會因為 patch 過程中出現沖突而中斷,解決方法:

在 diff 時忽略源碼目錄下的 .git, .gitgitignore, 以及某設備樹文件,保證打補丁時無沖突。

手動執行 kernel.mk 中的流程。

生成 defconfig

在樹莓派官方 bcm2711_defconfig 基礎上進行增改(當前位于 OpenHarmony 目錄):

  1. cp ../rpi-kernel/linux/arch/arm/configs/bcm2711_defconfig kernel/linux/config/linux-5.10/arch/arm/configs/bcm2711_standard_defconfig

增改主要有:

  1. OHOS上層系統所需:開啟 SELinux, Binder, ALSA。
  2. 顯示:開啟 DRM, VC4。
  3. 觸屏:開啟 INPUT_TOUCHSCREEN, HID_MULTITOUCH, ADS7846, USB_COMPOSITE。因為我使用的微雪觸屏控制器為 ADS7846,且是 USB 連線。
  4. 按鍵關機:開啟 CONFIG_KEYBOARD_GPIO,以將 gpio-key 驅動編譯進內核。

生成方法:

先進行一次內核編譯:

  1. ./build.sh --product-name rpi4 --ccache --jobs $(nproc) --build-target brcm_products

再進入 out 下的內核源碼根目錄,利用 menuconfig 配置 .config,最后用 savedefconfig 保存:

  1. cd out/KERNEL_OBJ/kernel/src_tmp/linux-5.10
  2. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make bcm2711_standard_defconfig
  3. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make menuconfig
  4. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make savedefconfig
  5. cp savedefconfig ../../../../../kernel/linux/config/linux-5.10/arch/arm/configs/bcm2711_standard_defconfig

或者直接對 bcm2711_standard_defconfig 增改以下內容:

  1. CONFIG_KEYBOARD_GPIO=y
  2. CONFIG_TOUCHSCREEN_ADS7846=y
  3. CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=y
  4. CONFIG_TOUCHSCREEN_USB_COMPOSITE=y
  5. CONFIG_DRM=y
  6. CONFIG_DRM_V3D=y
  7. CONFIG_DRM_VC4=y
  8. CONFIG_SND=y
  9. CONFIG_SND_SOC=y
  10. CONFIG_HID_MULTITOUCH=y
  11. CONFIG_ANDROID=y
  12. CONFIG_ANDROID_BINDER_IPC=y
  13. # CONFIG_DRIVERS_HDF is not set
  14. CONFIG_SECURITY_SELINUX=y
  15. CONFIG_SECURITY_SELINUX_BOOTPARAM=y
  16. CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1

由于本流程沒有移植 HDF,因此不開啟 HDF 驅動。

編譯腳本修正

源碼編譯腳本默認生成 uImage,這要求樹莓派4B用 u-boot 引導,比較費事。因此將 kernel/linux/build/ 目錄下的kernel.mk, build_kernel.sh, BUILD.gn ,kernel_module_build.sh 中的 uImage 都改為 zImage。

事實上不修改也沒有關系。在最終生成 uImage 之前,內核編譯時會在 boot 下首先生成 zImage,手動將其復制到鏡像輸出目錄即可:

  1. cp out/KERNEL_OBJ/kernel/src_tmp/linux-5.10/arch/arm/boot/zImage out/ohos-arm-release/packages/phone/images

顯示與觸摸配置

顯示

  1. vi third_party/weston/weston.ini

最后添加:

  1. [output]
  2. name=card0

不設置一般也沒有關系,默認通過card0節點顯示。如果輸出節點為 HDMI-A-1 并需要旋轉,則添加:

  1. [output]
  2. name=HDMI-A-1
  3. transform=rotate-90

觸摸

  1. vi third_party/eudev/rules.d/touchscreen.rules

修改為:

  1. ATTRS{name}=="WaveShare WS170120", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
  2. ATTRS{name}=="VSoC keyboard", ENV{ID_INPUT}="1", ENV{ID_INPUT_KEYBOARD}="1"
  3. DRIVERS=="hid-multitouch", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"

其中 WaveShare WS170120 為微雪觸摸屏插入 usb 后,在 /sys/dev/char/xx\:xx/device/uevent 查詢得到的設備名。支持 hid-multitouch 。

其它修正

init.cfg

初始化配置文件,類似于 Android 里的 init.rc

  1. vi /base/startup/init_lite/services/etc/init.cfg

進行修改:

  1. - "/etc/init.Hi3516DV300.cfg"
  2. + "/etc/init.rpi4.cfg"
  1. - "mount ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor /vendor wait rdonly barrier=1",
  2. - "mount ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc"
  3. + "mount ext4 /dev/block/mmcblk0p3 /vendor wait rdonly barrier=1",
  4. + "mount ext4 /dev/block/mmcblk0p4 /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc"

vendor

雖然沒有移植 HDF 驅動,但是相關文件對內核編譯流程是必要的。在 OpenHarmony/vendor 下新建文件,目錄結構如下所示:

  1. vendor
  2. └── raspberry
  3. └── rpi4
  4. └── hdf_config
  5. ├── hdf.hcs
  6. ├── hdf_test
  7. │ ├── hdf.hcs
  8. │ └── Makefile
  9. ├── khdf
  10. │ ├── hdf.hcs
  11. │ └── Makefile
  12. ├── Makefile
  13. └── uhdf
  14. └── hdf.hcs

其中 hdf.hcs 均為:

  1. root {
  2. module = "default";
  3. }

Makefile 均拷貝自 OpenHarmony/vendor/hisilicon/Hi3516DV300/hdf_config/khdf/Makefile

camera.rpi4.gni

雖然沒有移植 camera 驅動,但也對編譯是必要的,否則報錯:

  1. cp drivers/peripheral/camera/hal/adapter/chipset/gni/camera.rpi3.gni drivers/peripheral/camera/hal/adapter/chipset/gni/camera.rpi4.gni

鏡像大小

鏡像大小可以在 OpenHarmony/build/ohos/images/mkimage/ 下的 xxx_image_conf.txt 里修改。

編譯

在根目錄 OpenHarmony 下執行:

  1. bash build/prebuilts_download.sh

下載的第三方開源軟件壓縮包存放于 OpenHarmony 同目錄下的 OpenHarmony_2.0_canary_prebuilts。其中腳本在用 wget 下載 mingw-w64 時,由于后者過大可能觸發 Segmentation fault (core dumped) 。目前還沒有找到比較好的解決方法,只有用其它下載工具手動從華為鏡像下載 clang-mingw.tar.gz 后再放進去。

編譯:

  1. ./build.sh --product-name rpi4 --ccache --jobs $(nproc)

編譯內核前腳本會在控制臺打印編譯命令,這方便我們在出錯后或是修改config后,到內核源碼根目錄手動編譯。手動編譯時可能會出現找不到環境變量 PRODUCT_PATH 的錯誤,手動設置:

  1. export PRODUCT_PATH=vendor/raspberry/rpi4

制作SD卡并啟動

分區與格式化

利用 fdisk 設置 sd 卡分區:

  1. sudo fdisk /dev/mmcblk0

步驟:

  1. 刪除既有分區。(d 命令)
  2. 新建四個主分區,分別對應 boot, system, vendor 與 userdata。大小由對應鏡像決定。(n 命令)
  3. 設置 p1 分區文件類型為 W95 FAT32 (LBA)。(t 命令后選擇 c)
  4. 為 p1 分區添加可啟動標志。(a 命令)

可能的最終效果(p 命令):

設備 啟動 起點 末尾 扇區 大小 Id 類型

  1. 設備 啟動 起點 末尾 扇區 大小 Id 類型
  2. /dev/mmcblk0p1 * 2048 264191 262144 128M c W95 FAT32 (LBA)
  3. /dev/mmcblk0p2 264192 4458495 4194304 2G 83 Linux
  4. /dev/mmcblk0p3 4458496 5507071 1048576 512M 83 Linux
  5. /dev/mmcblk0p4 5507072 62333951 56826880 27.1G 83 Linux

對應的 fdisk 內命令執行序列:

  1. n p 1 +128M n p 2 +2G n p 3 +512M n p t 1 c a 1 w

格式化:

  1. sudo mkfs.msdos /dev/mmcblk0p1 -n boot
  2. sudo mkfs.ext4 /dev/mmcblk0p2
  3. sudo mkfs.ext4 /dev/mmcblk0p3
  4. sudo mkfs.ext4 /dev/mmcblk0p4

制備boot

基于樹莓派官方 firmware。設 boot 分區 /dev/mmcblk0p1 已經掛載到 /media/username/boot 下:

  1. cd ../ && git clone git://github.com/raspberrypi/firmware --depth=1
  2. cp firmware/boot/{overlays,bcm2711-rpi-4-b.dtb,bcm2711-rpi-400.dtb,bcm2711-rpi-cm4.dtb,cmdline.txt,config.txt,fixup4.dat,fixup4x.dat,start4.elf,start4x.elf} /media/username/boot -r
  3. cp OpenHarmony/out/ohos-arm-release/packages/phone/images/zImage /media/username/boot

修改 config.txt :

  1. vi /media/username/boot/config.txt
  1. # Kernel
  2. kernel=zImage
  3.  
  4. # waveshare touchscreen
  5. max_usb_current=1
  6. hdmi_group=2
  7. hdmi_mode=87
  8. hdmi_cvt 800 480 60 6 0 0 0
  9. hdmi_drive=1
  10.  
  11. # fake KMS
  12. dtoverlay=vc4-fkms-v3d
  13.  
  14. enable_uart=1
  15.  
  16. # output diagnostic information
  17. uart_2ndstage=1
  18.  
  19. # for hardware power button
  20. dtoverlay=gpio-key,gpio=3,keycode=116,label="POWER"

修改 cmdline.txt :

  1. vi /media/username/boot/cmdline.txt
  1. console=serial0,115200 no_console_suspend root=/dev/mmcblk0p2 elevator=deadline rootwait spidev.bufsiz=65536 androidboot.hardware=rpi4 androidboot.selinux=permissive

刷寫鏡像

  1. cd OpenHarmony/out/ohos-arm-release/packages/phone/images
  2. sudo dd if=system.img of=/dev/mmcblk0p2 bs=1M
  3. sudo dd if=vendor.img of=/dev/mmcblk0p3 bs=1M
  4. sudo dd if=userdata.img of=/dev/mmcblk0p4 bs=1M

啟動

為使微雪觸摸屏成功顯示,須滿足以下三個條件:

config.txt : 手動設置 HDMI 輸出配置(來自官網要求:5inch_HDMI_LCD)

  1. max_usb_current=1
  2. hdmi_group=2
  3. hdmi_mode=87
  4. hdmi_cvt 800 480 60 6 0 0 0
  5. hdmi_drive=1

config.txt : dtoverlay=vc4-fkms-v3d 啟用 fake KMS

至少要在顯示器啟動前插入樹莓派,且是遠離 Type-C 的 Micro HDMI 口。保證樹莓派能識別到屏幕。

按鍵關機

在配置內核編譯 defconfig 時,我們開啟了 CONFIG_KEYBOARD_GPIO 以將 gpio-key 編譯進內核——這是一個與體系結構無關的 GPIO 按鍵驅動。只需要在設備樹 gpio-key 節點添加需要的按鍵子節點后即可將 GPIO 狀態變化轉換為按鍵事件。

而樹莓派官方已經有相應實現(詳見 rpi-kernel/linux/arch/arm/boot/dts/overlays/README),只需要在 config.txt 開啟即可:

  1. dtoverlay=gpio-key,gpio=3,keycode=116,label="POWER"

這樣,GPIO3 會被默認拉高,當它被接地時 gpio-key 就會將其轉化為鍵碼值 116 的按鍵事件輸出到 /dev/input/event0。

在主流的 Linux 發行版上(如基于 Debian 的 Raspbian OS),systemd 自帶按鍵事件監聽進程,只需在 /etc/systemd/logind.conf 中取消注釋 HandlePowerKey = ignore 即可實現物理按鍵(或按 F5)關機。

Android 與 OpenHarmony 雖然不用 systemd,但可以運行服務。因此我們自己寫一個簡單的守護程序:

  1. mkdir ../event0reader && cd $_
  2. vi event0reader.c
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8.  
  9. #define DEV_PATH "/dev/input/event0"
  10.  
  11. int main()
  12. {
  13. int keys_fd;
  14. int ret=0;
  15. struct input_event t;
  16. keys_fd=open(DEV_PATH, O_RDONLY);
  17. if(keys_fd <= 0)
  18. {
  19. printf("open /dev/input/event0 device error!\n");
  20. return -1;
  21. }
  22. while(1)
  23. {
  24. if(read(keys_fd, &t, sizeof(t)) == sizeof(t))
  25. {
  26. if(t.type==EV_KEY && t.code==116 && t.value==1)
  27. {
  28. ret=system("/bin/reboot shutdown");
  29. if (ret == -1)
  30. {
  31. printf("failed to shutdown!\n");
  32. return -1;
  33. }
  34. }
  35. }
  36. usleep(100000);
  37. }
  38. close(keys_fd);
  39. return 0;
  40. }

其中 /bin/reboot 是 OHOS 自帶的重啟/關機程序,源碼位于 OpenHarmony/base/startup/init_lite/services/cmds/reboot/init_cmd_reboot.c。

使用靜態鏈接庫編譯以保證程序成功運行。設 system 分區 /dev/mmcblk0p2 已經掛載到 /media/username/_ 下:

  1. arm-linux-gnueabihf-gcc event0reader.c -o myservice -static
  2. sudo cp myservice /media/username/_/system/bin/
  3. sudo chmod 777 /media/username/_/system/bin/myservice
  4. sudo chgrp 2000 /media/username/_/system/bin/myservice

在 OHOS 初始化時,內核會遍歷 /system/etc/init/ 下的所有初始化配置。我們在該目錄下寫一個對應的 myservice.cfg:

  1. sudo vi /media/username/_/system/etc/init/myservice.cfg
  1. {
  2. "jobs" : [{
  3. "name" : "post-fs",
  4. "cmds" : [
  5. "start myservice_shutdown"
  6. ]
  7. }
  8. ],
  9. "services" : [{
  10. "name" : "myservice_shutdown",
  11. "path" : ["/system/bin/myservice"],
  12. "uid" : "root",
  13. "gid" : ["system", "shell"]
  14. }
  15. ]
  16. }

當我們在內核啟動時觀察到如下信息:

  1. # dmesg |grep myservice
  2. [ 3.722287] [pid=1][init_read_cfg.c:110][Init][INFO] ReadCfgs :/system/etc/init/myservice.cfg from /system/etc/init success.
  3. [ 7.558109] [pid=1][param_service.c:263][Init][INFO] SystemWriteParam name init.svc.myservice_shutdown value: running
  4. [ 7.558618] [pid=116][init_service.c:200][Init][INFO] service->name is myservice_shutdown
  5. [ 7.569011] [pid=1][trigger_processor.c:165][Init][INFO] PostParamTrigger init.svc.myservice_shutdown success

則意味著 myservice 成功啟動了,可以利用物理按鍵關機。接線示意圖:

OpenHarmony3.0的樹莓派4B移植-學習記錄

原文鏈接:https://harmonyos.51cto.com

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品永久免费 | 国产999精品久久久影片官网 | 精品国产乱码久久久久久图片 | 欧美精品在线播放 | 热久久影院 | 一区二区三区免费看 | 美足av | 黄色在线免费 | 亚洲91精品 | 欧美视频二区 | 欧美精品成人一区二区三区四区 | 国产精品久久久久无码av | 欧美日韩久久精品 | 亚洲国产高清在线 | 亚洲 成人 av | 日韩三级av在线 | 一级黄色片视频 | 国产日韩一区二区三区 | 国产丝袜一区 | 求av网址 | 日韩中文字幕在线视频 | 午夜电影网址 | 激情欧美日韩一区二区 | 亚洲一区二区免费看 | 亚洲一区二区在线 | 日日爱999| 999这里只有是极品 最新中文字幕在线 | 久久男人| 欧美日韩一区二区在线播放 | 欧美成人久久久免费播放 | 免费一级欧美在线观看视频 | 欧美精品综合 | 成人av高清在线 | 久久国产精品免费一区二区三区 | 国产特级毛片aaaaaa高清 | 91羞羞网站| 国产精品网站在线观看 | 国产亚洲精品久久久456 | 亚洲 欧美 精品 | 国内精品一区二区 | 亚洲精品久久一区二区三区 |