成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux內核增加HDF驅動子系統

系統 Linux
HDF驅動子系統是OpenHarmony重要的特色功能之一,其主要的功能是實現驅動程序在多內核多平臺的物聯網環境,實現一次驅動開發,多端部署。

[[440302]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

HDF驅動子系統是OpenHarmony重要的特色功能之一,其主要的功能是實現驅動程序在多內核多平臺的物聯網環境,實現一次驅動開發,多端部署。之前移植OHOS3.0使用了傳統的linux驅動,比較遺憾,今天嘗試將HDF驅動子系統加入編譯框架。開始前先了解幾個名詞。

HCS(HDF Configuration Source)是 HDF 驅動框架的配置描述源碼,JSON存儲。

HC-GEN(HDF Configuration Generator)是 HCS 配置轉換工具,可以將 HDF 配置文件HCS轉換為二進制HCB。

HCB(HDF Configuration Binary)二進制文件,驅動可使用 HDF 框架提供的配置解析接口獲取配置。

內核打補丁

如何在內核加入HDF驅動,linux內核下主要實現是下面兩個目錄:

drivers\adapter\khdf\linux 和 drivers\framework

這兩個目錄是通過鏈接的方式加入到內核編譯的,流程如下:

kernel\linux\build\kernel.mk:75

  1. $(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(HDF_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE) 

 可以參考3516的HDF補丁:kernel\linux\patches\linux-5.10\hi3516dv300_patch\hdf.patch

  1. patching file drivers/Kconfig 
  2. patching file drivers/Makefile 
  3. patching file drivers/hdf/Makefile 
  4. patching symbolic link drivers/hdf/framework 
  5. patching symbolic link drivers/hdf/khdf 
  6. patching symbolic link include/hdf 
  7.  
  8. # 添加到linux內核的補丁 
  9. drivers/hdf/framework -> /drivers/framework/        # 驅動子系統驅動框架、配置管理、配置解析、驅動通用框架模型、硬件通用平臺能力接口等 
  10. drivers/hdf/khdf -> /drivers/adapter/khdf/linux/    # 在linux內核中部署OpenHarmony驅動框架 
  11. drivers/hdf/Makefile                                # 由hdf.patch提供 
  12. include/hdf -> /drivers/framework/include/          # 驅動框架對外提供能力的頭文件 

內核配置

只是打上補丁還不行,還得在內核的編譯配置文件中加入HDF選項。最開始的做法就是參考3516的配置選擇,但是發現有些配置會導致編譯失敗。測試發現下面的配置是可以編譯成功的。

  1. [*] Enable HDF manager                      
  2. (2)   Set HDF support platform              
  3. [*]   Enable HDF platform driver            
  4. [*]     Enable HDF platform mipi dsi driver 
  5. [*]     Enable HDF platform gpio driver     
  6. [*]     Enable HDF platform i2c driver      
  7. [*]     Enable HDF platform watchdog driver 
  8. [*] hi35xx pwm driver                       
  9. [*] Enable HDF platform pwm driver          
  10. [*] Enable HDF platform uart driver         
  11. [ ] Enable HDF platform sdio driver         
  12. [ ] Enable HDF platform emmc driver         
  13. [*] Enable HDF platform mmc driver          
  14. [*] Enable HDF platform spi driver          
  15. [*] Enable HDF platform rtc driver          
  16. [*] Enable HDF linux test                   
  17. [*] Enable HDF Display driver               
  18. [ ]   Enable HDF Lcdkit driver              
  19. [*]   Enable HDF Icn9700 driver             
  20. [ ]   Enable HDF St7789 driver              
  21. [*] Enable HDF input driver                 
  22. [*]   Enable HDF tp 5P5 GT911 driver        
  23. [*]   Enable HDF tp 2P35 FT6236 driver      
  24. [ ] Enable HDF wifi                         
  25. [ ] Enable HDF Bluetooth                    
  26. [*] Enable HDF sensor driver                
  27. [ ]   Enable HDF accel sensor driver        
  28. [ ]   Enable HDF gyro sensor driver         
  29. [ ]   Enable HDF barometer sensor driver    
  30. [ ]   Enable HDF hall sensor driver         
  31. [*] Enable HDF storage driver               
  32. [ ] Enable HDF USB PNP Notify driver        
  33. [ ] Enable F_GENERIC driver                 
  34. [ ] Enable HDF Audio driver                 
  35. [*] Enable HDF vibrator driver              
  36. [*]   Enable HDF linear vibrator driver     
  37. [ ] Enable HDF dsoftbus driver 
  38.  
  39. CONFIG_DRIVERS_HDF=y 
  40. CONFIG_HDF_SUPPORT_LEVEL=2 
  41. CONFIG_DRIVERS_HDF_PLATFORM=y 
  42. CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI=y 
  43. CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y 
  44. CONFIG_DRIVERS_HDF_PLATFORM_I2C=y 
  45. CONFIG_DRIVERS_HDF_PLATFORM_WATCHDOG=y 
  46. CONFIG_PWM_HI35XX=y 
  47. CONFIG_DRIVERS_HDF_PLATFORM_PWM=y 
  48. CONFIG_DRIVERS_HDF_PLATFORM_UART=y 
  49. # CONFIG_DRIVERS_HDF_PLATFORM_SDIO is not set 
  50. # CONFIG_DRIVERS_HDF_PLATFORM_EMMC is not set 
  51. CONFIG_DRIVERS_HDF_PLATFORM_MMC=y 
  52. CONFIG_DRIVERS_HDF_PLATFORM_SPI=y 
  53. CONFIG_DRIVERS_HDF_PLATFORM_RTC=y 
  54. CONFIG_DRIVERS_HDF_TEST=y 
  55. CONFIG_DRIVERS_HDF_DISP=y 
  56. # CONFIG_DRIVERS_HDF_LCDKIT is not set 
  57. CONFIG_DRIVERS_HDF_LCD_ICN9700=y 
  58. # CONFIG_DRIVERS_HDF_LCD_ST7789 is not set 
  59. CONFIG_DRIVERS_HDF_INPUT=y 
  60. CONFIG_DRIVERS_HDF_TP_5P5_GT911=y 
  61. CONFIG_DRIVERS_HDF_TP_2P35_FT6236=y 
  62. # CONFIG_DRIVERS_HDF_WIFI is not set 
  63. # CONFIG_DRIVERS_HDF_BT is not set 
  64. CONFIG_DRIVERS_HDF_SENSOR=y 
  65. # CONFIG_DRIVERS_HDF_SENSOR_ACCEL is not set 
  66. # CONFIG_DRIVERS_HDF_SENSOR_GYRO is not set 
  67. # CONFIG_DRIVERS_HDF_SENSOR_BAROMETER is not set 
  68. # CONFIG_DRIVERS_HDF_SENSOR_HALL is not set 
  69. CONFIG_DRIVERS_HDF_STORAGE=y 
  70. # CONFIG_DRIVERS_HDF_USB_PNP_NOTIFY is not set 
  71. # CONFIG_DRIVERS_HDF_USB_F_GENERIC is not set 
  72. # CONFIG_DRIVERS_HDF_AUDIO is not set 
  73. CONFIG_DRIVERS_HDF_VIBRATOR=y 
  74. CONFIG_DRIVERS_HDF_VIBRATOR_LINEAR=y 
  75. # CONFIG_DRIVERS_HDF_DSOFTBUS is not set 
  76. end of Device Drivers 

[*] Enable HDF linux test 是需要設置的,如果沒有設置CONFIG_DRIVERS_HDF_TEST,目錄結構就出問題了,會報這樣的錯誤。

  1. drivers/hdf/khdf/Makefile:22: PRODUCT_PATH=vendor/raspberrypi/RPI4B 
  2. scripts/Makefile.build:44: drivers/hdf/khdf/../../../../vendor/raspberrypi/RPI4B/hdf_config/Makefile: No such file or directory 
  3. make[5]: *** No rule to make target 'drivers/hdf/khdf/../../../../vendor/raspberrypi/RPI4B/hdf_config/Makefile'.  Stop. 
  4. CC [M]  drivers/net/wireless/mac80211_hwsim.o 
  5. make[4]: *** [scripts/Makefile.build:497: drivers/hdf/khdf/../../../../vendor/raspberrypi/RPI4B/hdf_config] Error 2 
  6. make[3]: *** [scripts/Makefile.build:497: drivers/hdf/khdf] Error 2 
  7. make[2]: *** [scripts/Makefile.build:497: drivers/hdf] Error 2 
  8. make[2]: *** Waiting for unfinished jobs.... 

 下面3個選項要關閉,不然會報下面的錯誤。

[ ] Enable HDF platform sdio driver

[ ] Enable HDF platform emmc driver

[ ] Enable HDF wifi

  1. drivers/../../../../../../drivers/adapter/khdf/linux/platform/sdio/sdio_adapter.o: In function `Hi35xxLinuxSdioRescan': 
  2. sdio_adapter.c:(.text+0x20): undefined reference to `hisi_sdio_rescan' 
  3. sdio_adapter.c:(.text+0x34): undefined reference to `himci_get_mmc_host' 
  4. drivers/../../../../../../drivers/adapter/khdf/linux/platform/sdio/sdio_adapter.o: In function `Hi35xxLinuxSdioFindFunc': 
  5. sdio_adapter.c:(.text+0xc84): undefined reference to `himci_get_mmc_host' 
  6. sdio_adapter.c:(.text+0xc9c): undefined reference to `himci_get_mmc_host' 
  7. sdio_adapter.c:(.text+0xcb4): undefined reference to `himci_get_mmc_host' 
  8. drivers/../../../../../../drivers/adapter/khdf/linux/platform/emmc/emmc_adapter.o: In function `Hi35xxLinuxEmmcBind': 
  9. emmc_adapter.c:(.text+0x214): undefined reference to `himci_get_mmc_host' 
  10. drivers/../../../../../../device/hisilicon/drivers/wifi/driver/hi3881/oal/oal_sdio_host.o: In function `sdio_card_detect_change': 
  11. oal_sdio_host.c:(.text+0x2ce8): undefined reference to `hisi_sdio_rescan' 
  12. make[1]: *** [Makefile:1179: vmlinux] Error 1 
  13. make[1]: Leaving directory '/home/liangzili/ohos/out/KERNEL_OBJ/kernel/src_tmp/linux-5.10' 
  14. make: *** [kernel.mk:80: /home/liangzili/ohos/out/KERNEL_OBJ/kernel/src_tmp/linux-5.10/arch/arm/boot/zImage] Error 2 
  15. ninja: build stopped: subcommand failed. 

編譯過程

為了方便測試可以單獨進行內核編譯,比如我的編譯命令是這樣的。

  1. ./build.sh --product-name RPI4B --ccache --build-target raspberrypi_products 

 可以分析下HDF這部分的編譯過程。

linux-5.10\drivers\hdf\Makefile,hdf.patch會添加這個Makefile,將khdf文件夾加入編譯。

  1. obj-$(CONFIG_DRIVERS_HDF) += khdf/ 

 linux-5.10\drivers\hdf\khdf\Makefile

  1. export HDF_ROOT := drivers/hdf 
  2. obj-$(CONFIG_DRIVERS_HDF)  += osal/ 
  3. obj-$(CONFIG_DRIVERS_HDF)  += network/ 
  4. obj-$(CONFIG_DRIVERS_HDF)  += config/ 
  5.  
  6. SUPPORT_LEVEL_STD_H := $(shell [ "$(CONFIG_HDF_SUPPORT_LEVEL)" -ge 2 ] && echo true
  7.  
  8. $(warning PRODUCT_PATH=$(PRODUCT_PATH))     # 會檢查PRODUCT_PATH變量 
  9. ifeq ($(PRODUCT_PATH),) 
  10. $(error PRODUCT_PATH not
  11. endif 
  12.  
  13. # 這里有條注釋指明了*.hcs配置文件的存放路徑 
  14. for L2+, hcs config should in vendor/product_company/product_name/config/khdf 
  15. ifeq ($(SUPPORT_LEVEL_STD_H), true
  16. SUB_DIR:=khdf/ 
  17. endif 
  18.  
  19. # HDF test的配置會使hcs目錄結構不一樣,我當時沒有設置CONFIG_DRIVERS_HDF_TEST就掉這個坑里了。 
  20. ifeq ($(CONFIG_DRIVERS_HDF), y) 
  21. ifeq ($(CONFIG_DRIVERS_HDF_TEST), y) 
  22. obj-$(CONFIG_DRIVERS_HDF) += ../../../../$(PRODUCT_PATH)/hdf_config/$(SUB_DIR)/hdf_test/ 
  23. obj-$(CONFIG_DRIVERS_HDF) += test/ 
  24. else 
  25. obj-$(CONFIG_DRIVERS_HDF) += ../../../../$(PRODUCT_PATH)/hdf_config/$(SUB_DIR) 
  26. endif 
  27. endif 
  28. # ... 后面按照配置添加一些編譯目錄 ... 

drivers\adapter\khdf\linux\Makefile:會調用 obj-(CONFIG_DRIVERS_HDF) += ../../../../(CONFIGD​RIVERSH​DF)+=../../../../(PRODUCT_PATH)/hdf_config/$(SUB_DIR)/hdf_test/ 這是OHOS3.0默認的HCS文件存放路徑。官方的注釋也說明了,所以將設備對應的*.hcs存放到 vendor\raspberrypi\RPI4B\hdf_config\khdf 文件夾,參考 3516 的 vendor\hisilicon\Hi3516DV300\hdf_config\khdf\hdf.hcs 就可了。

  1. #include "device_info/device_info.hcs" 
  2. #include "platform/i2c_config.hcs" 
  3. #include "platform/hi35xx_watchdog_config.hcs" 
  4. #include "platform/hi35xx_pwm_config.hcs" 
  5. #include "platform/hi35xx_uart_config.hcs" 
  6. #include "platform/sdio_config.hcs" 
  7. #include "platform/emmc_config.hcs" 
  8. #include "platform/hi35xx_spi_config.hcs" 
  9. #include "input/input_config.hcs" 
  10. #include "wifi/wlan_platform.hcs" 
  11. #include "wifi/wlan_chip_hi3881.hcs" 
  12. #include "sensor/sensor_config.hcs" 
  13. #include "audio/audio_config.hcs" 
  14. #include "audio/codec_config.hcs" 
  15. #include "audio/dai_config.hcs" 
  16. #include "audio/dma_config.hcs" 
  17. #include "audio/dsp_config.hcs" 
  18. #include "vibrator/vibrator_config.hcs" 
  19. #include "vibrator/linear_vibrator_config.hcs" 
  20. #include "lcd/lcd_config.hcs" 
  21.  
  22. root { 
  23.     module = "hisilicon,hi35xx_chip"

參考 3516 的 vendor\hisilicon\Hi3516DV300\hdf_config\khdf\Makefile

其中:PRODUCT_PATH環境變量的來源:kernel/linux/build/kernel_module_build.sh:42:export PRODUCT_PATH=$4

  1. ifeq ($(LOCAL_HCS_ROOT),) 
  2.   LOCAL_HCS_ROOT := $(PRODUCT_PATH) 
  3. endif 
  4.  
  5. SOURCE_ROOT:=$(abspath ../../../../../) 
  6.  
  7. HC_GEN_DIR := $(abspath $(SOURCE_ROOT)/drivers/framework/tools/hc-gen) 
  8. HC_GEN := $(HC_GEN_DIR)/build/hc-gen 
  9. LOCAL_HCS_ROOT := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))) 
  10.  
  11. HCS_DIR := $(LOCAL_HCS_ROOT) 
  12.  
  13. ifneq ($(TARGET_BOARD_PLATFORM),) 
  14.   HCS_DIR := $(LOCAL_HCS_ROOT)/$(TARGET_BOARD_PLATFORM) 
  15. else 
  16.   ifneq ($(CONFIG_ARCH_HI3516DV300),) 
  17.     HCS_DIR := $(LOCAL_HCS_ROOT) 
  18.   endif 
  19.   ifneq ($(CONFIG_ARCH_HI3518EV300),) 
  20.     HCS_DIR := $(LOCAL_HCS_ROOT) 
  21.   endif 
  22. endif 
  23. $(info HCS_DIR = $(HCS_DIR)) 
  24. HCB_FLAGS := -b -i -a 
  25.  
  26. HCS_OBJ := hdf_hcs_hex.o 
  27. HCS_OBJ_SRC := $(subst .o,.c,$(notdir $(HCS_OBJ))) 
  28.  
  29. CONFIG_GEN_HEX_SRC := $(addprefix $(LOCAL_HCS_ROOT)/, $(HCS_OBJ_SRC)) 
  30. CONFIG_HCS_SRC := $(subst _hcs_hex.o,.hcs,$(addprefix $(HCS_DIR)/, $(HCS_OBJ))) 
  31.  
  32. $(obj)/$(HCS_OBJ): $(CONFIG_GEN_HEX_SRC) 
  33.     $(Q)$(CC) $(c_flags) -c -o $@ $< 
  34.     $(Q)rm -f $< 
  35.  
  36. $(CONFIG_GEN_HEX_SRC):  $(LOCAL_HCS_ROOT)/%_hcs_hex.c: $(HCS_DIR)/%.hcs | $(HC_GEN) 
  37.     $(Q)echo gen hdf built-in config 
  38.     $(Q)if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi 
  39.     $(Q)$(HC_GEN) $(HCB_FLAGS) -o $(subst _hex.c,,$(@)) $< 
  40.  
  41. $(CONFIG_GEN_SRCS): $(CONFIG_OUT_DIR)%.c: $(HCS_DIR)/%.hcs | $(HC_GEN) 
  42.     $(Q)echo gen hdf driver config 
  43.     $(Q)if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi 
  44.     $(Q)$(HC_GEN) -t -o $@ $< 
  45.  
  46. $(HC_GEN): 
  47.     $(HIDE)make -C $(HC_GEN_DIR) 
  48.  
  49. obj-$(CONFIG_DRIVERS_HDF) += $(HCS_OBJ) 

查看結果

編譯完成后,可以上傳內核鏡像到開發板,來查看HDF驅動框架是否啟動成功。

加入HDF前:

  1. # ls dev/ 
  2. __parameters__  hwrng         tty1   tty28  tty46  tty7 
  3. __trigger__     input         tty10  tty29  tty47  tty8 
  4. autofs          kmsg          tty11  tty3   tty48  tty9 
  5. binder          linux,cma     tty12  tty30  tty49  ttyAMA0 
  6. block           loop-control  tty13  tty31  tty5   ttyS0 
  7. bus             mem           tty14  tty32  tty50  ttyprintk 
  8. cachefiles      memcg         tty15  tty33  tty51  unix 
  9. char            null          tty16  tty34  tty52  urandom 
  10. console         port          tty17  tty35  tty53  vchiq 
  11. cpuctl          ptmx          tty18  tty36  tty54  vcs 
  12. cpuset          pts           tty19  tty37  tty55  vcs1 
  13. dri             random        tty2   tty38  tty56  vcsa 
  14. fd              rawctl        tty20  tty39  tty57  vcsa1 
  15. freezer         snd           tty21  tty4   tty58  vcsu 
  16. fscklogs        stderr        tty22  tty40  tty59  vcsu1 
  17. full            stdin         tty23  tty41  tty6   vga_arbiter 
  18. gpiochip0       stdout        tty24  tty42  tty60  vndbinder 
  19. gpiochip1       system        tty25  tty43  tty61  watchdog 
  20. graphics        tty           tty26  tty44  tty62  watchdog0 
  21. hwbinder        tty0          tty27  tty45  tty63  zero 

 加入HDF后:

  1. # ls dev/ 
  2. HDF_PLATFORM_I2C_MANAGER  loop-control    tty24  tty54 
  3. HDF_PLATFORM_UART_1       mem             tty25  tty55 
  4. HDF_TEST                  memcg           tty26  tty56 
  5. I2C_TEST                  null            tty27  tty57 
  6. __parameters__            port            tty28  tty58 
  7. __trigger__               ptmx            tty29  tty59 
  8. autofs                    pts             tty3   tty6 
  9. binder                    random          tty30  tty60 
  10. block                     rawctl          tty31  tty61 
  11. bus                       sample_service  tty32  tty62 
  12. cachefiles                snd             tty33  tty63 
  13. char                      stderr          tty34  tty7 
  14. console                   stdin           tty35  tty8 
  15. cpuctl                    stdout          tty36  tty9 
  16. cpuset                    system          tty37  ttyAMA0 
  17. dev_mgr                   tty             tty38  ttyS0 
  18. dri                       tty0            tty39  ttyprintk 
  19. fd                        tty1            tty4   unix 
  20. freezer                   tty10           tty40  urandom 
  21. fscklogs                  tty11           tty41  vchiq 
  22. full                      tty12           tty42  vcs 
  23. gpiochip0                 tty13           tty43  vcs1 
  24. gpiochip1                 tty14           tty44  vcsa 
  25. graphics                  tty15           tty45  vcsa1 
  26. hdf_bl                    tty16           tty46  vcsu 
  27. hdf_input_host            tty17           tty47  vcsu1 
  28. hdf_misc_vibrator         tty18           tty48  vga_arbiter 
  29. hdf_sensor_manager_ap     tty19           tty49  vndbinder 
  30. hwbinder                  tty2            tty5   watchdog 
  31. hwrng                     tty20           tty50  watchdog0 
  32. input                     tty21           tty51  zero 
  33. kmsg                      tty22           tty52 
  34. linux,cma                 tty23           tty53 

 基本算是啟動成功了,接下來考慮打算用HDF的方式添加一下設備。來驗證HDF驅動框架是否運轉正常。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2015-10-19 17:36:19

MOST內核Linux

2016-07-22 10:50:56

Linux內核無線子系統

2021-08-31 11:53:38

Linux inputLinux 系統

2021-08-10 11:30:30

Linux代碼中斷控制器

2021-08-03 15:10:26

Linux代碼驅動

2021-07-07 08:00:00

Linux開發虛擬機

2021-04-06 11:18:47

LinuxWWAN子系統驅動

2011-08-16 16:20:33

Linuxkconfigmakefile

2009-10-12 12:46:55

Linux內核SCSI IO

2022-01-16 07:41:46

Windows 11操作系統微軟

2023-03-20 16:21:26

ADC數字轉換器

2022-08-08 19:35:37

HDF驅動開發鴻蒙

2023-03-21 18:06:49

ADC數字轉換器

2019-07-15 08:30:06

Linux 系統 數據

2015-08-03 10:43:58

Linux內核驅動

2022-10-08 11:57:30

Linux內核架構

2022-10-17 14:29:24

鴻蒙應用開發

2021-08-17 14:39:00

鴻蒙HarmonyOS應用

2021-12-08 08:41:31

Linux 中斷子系統Linux 系統

2021-07-22 08:03:08

Windows 操作系統Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜视频精品 | 色婷婷综合久久久久中文一区二区 | japanhd美女动 | 午夜一区| 在线伊人 | av中文字幕在线观看 | 成人在线电影网站 | 久久久久国产精品一区三寸 | 午夜精品久久久久久久久久久久久 | 人人草天天草 | 欧产日产国产精品视频 | 久草新在线 | 欧美成年视频 | 日日夜夜天天干 | 欧美在线观看网站 | 久草新视频 | 精品产国自在拍 | 欧美日韩国产在线观看 | 成人精品视频 | 久久国产成人 | 国产95在线 | 涩涩99 | 伊人看片 | 国产精品二区三区 | 国产成人精品区一区二区不卡 | 国产精品视频在线播放 | 日韩中文字幕网 | 成人亚洲视频 | 伊人免费在线观看 | 亚洲一区视频在线 | 亚洲第一网站 | 日韩中文字幕在线视频观看 | 成人小视频在线 | av日韩在线播放 | 国产999精品久久久影片官网 | 欧美一区二区三区小说 | 精品一区二区免费视频 | 天天欧美| 黄a在线观看 | 一区二区三区免费 | 国产精品爱久久久久久久 |