久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

uC/FS詳解(開發(fā)文檔)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月18日   【字體:

1: uC/FS簡(jiǎn)介

   µC/FS is a FAT file system which can be used on any media, for which you can 
provide basic hardware access functions. . µC/FS is a high performance library that has been optimized for speed, versatility and memory footprint.
   文件配置表(英文:File Allocation Table,首字母縮略字:FAT)是一種由微軟發(fā)明的并帶有部分專

件系統(tǒng)。FAT文件系統(tǒng)考慮當(dāng)時(shí)計(jì)算機(jī)效能有限,所以未被復(fù)雜化,因而被幾乎所有個(gè)人計(jì)算機(jī)的操作系統(tǒng)支持。這特性使它成為理想的軟盤和記憶卡文件系統(tǒng),也適合用作不同操作系統(tǒng)中的數(shù)據(jù)交流。但FAT有一個(gè)嚴(yán)重的缺點(diǎn):當(dāng)文件被刪除并且在同一位置被寫入新數(shù)據(jù),他們的片段通常是分散的,減慢了讀寫速度。磁盤碎片重整是一種解決方法,但必須經(jīng)常重組來(lái)保持FAT文件系統(tǒng)的效率。 FAT文件系統(tǒng)遵行已用了多年的軟件方法來(lái)進(jìn)行規(guī)范。它在1977年由比爾·蓋茨和馬斯·麥當(dāng)勞為了管理磁盤而發(fā)明。

2: uC/FS特點(diǎn)
µC/FS is written in ANSI C and can be used on virtually any CPU. Some 
features of µC/FS are: 
·  MS-DOS/MS-Windows compatible FAT12 and FAT16 support. 
·  Multiple device driver support. You can use different device drivers with µC/FS, which allows           you to access different types of hardware with the file system at the same time. 【在該文件系統(tǒng)中可同時(shí)支持多個(gè)設(shè)備驅(qū)動(dòng)】
·  Multiple media support. A device driver does allow you to access different medias at the same            time. 
·  OS support. µC/FS can easily be integrated into any OS. In that way you can make file operations        in a multithreaded environment. 
·  ANSI C stdio.h like API for user applications. An application using standard C I/O library can             easily be ported to use µC/FS. 
·  Very simple device driver structure. µC/FS device drivers need only very basic functions for                 reading and writing blocks. Therefore it is very simple to support your custom hardware. 
·  Generic device driver for SmartMedia cards, which can easily be used with any kind of card                  reader hardware. 
·  Generic device driver for MultitMedia & SD cards using SPI mode, which can be easily integrated.
3: uC/FS結(jié)構(gòu)
   µC/FS 由不同的分層構(gòu)成。
 
上面的圖是FATFS,但與UC/FS的是一樣的

   1:API層【類似于linux的VFS層】
      The API layer is the interface between µC/FS and the user application. It does contain a library of ANSI C oriented file functions, such as  FS_FOpen, FS_FWrite etc. The API layer does transfer these calls to the file system layer. Currently there is only a FAT file system layer available for µC/FS, but the API layer can deal with different file system layers at the same time. So it is possible to use FAT and any other file system at the same time with µC/FS.  
    API層是µC/FS 提供給用戶使用的接口層(fs_api.h),API層將各種調(diào)用傳輸?shù)?/span>file system layer(文件系統(tǒng)層),目前對(duì)µC/FS(文件管理實(shí)現(xiàn)機(jī)制)來(lái)說(shuō) 只有一個(gè) FAT文件系統(tǒng)層被使用,API層可以處理不同的文件系統(tǒng)層,因此µC/FS可同時(shí)支持多種文件系統(tǒng)(API層類似于linux中的虛擬文件系統(tǒng)VFS,他的功能是提供給童用戶標(biāo)準(zhǔn)的系統(tǒng)調(diào)用接口,VFS層下面才是具體實(shí)際的文件系統(tǒng)層,有FAT、EXT2等等,這個(gè)根據(jù)硬件的情況(格式化時(shí)使用什么文件系統(tǒng))來(lái)調(diào)用具體的文件系統(tǒng))。
   2:File System Layer 文件系統(tǒng)層【這層與linux是一樣的,是具體的管理文件所用的文件系統(tǒng)】
   The file system layer translates file operations to logical block operations. After such a translation, the file system calls the logical block layer and specifies the corresponding device driver for a device.
   文件系統(tǒng)層將文件操作轉(zhuǎn)換為邏輯塊操作,之后,具體的文件系統(tǒng)調(diào)用邏輯塊層函數(shù)并指定設(shè)備相應(yīng)的驅(qū)動(dòng);【linux中,文件系統(tǒng)將各種系統(tǒng)調(diào)用轉(zhuǎn)換為各種IO請(qǐng)求(系統(tǒng)請(qǐng)求即是對(duì)底層相應(yīng)的扇區(qū)、柱面、等操作),IO請(qǐng)求被放到對(duì)應(yīng)設(shè)備的IO請(qǐng)求隊(duì)列中去,再由一個(gè)系統(tǒng)內(nèi)核線程一直讀取請(qǐng)求隊(duì)列中的請(qǐng)求,沒有請(qǐng)求時(shí)就睡眠,拿到請(qǐng)求就通過設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)具體的操作】
    uC_FS\FSL\fat\ 下面就是FAT文件系統(tǒng)的各個(gè)文件。
   3:Logical Block Layer 邏輯塊
   the main purpose of the logical block layer is to synchronize accesses to a device driver and to have an easy interface for the file system layer.  The logical block layer does call a device driver to make a block operation. 
   邏輯塊層的主要目的是同步訪問設(shè)備驅(qū)動(dòng)與文件系統(tǒng)的簡(jiǎn)易接口,邏輯塊層調(diào)用設(shè)備驅(qū)動(dòng)來(lái)實(shí)現(xiàn)設(shè)備的塊操作。
   4: Device Driver Layer 設(shè)備驅(qū)動(dòng)層
   Device drivers are low level routines that are used to access your hardware. 
The structure of the device driver is simple to allow easy integration of your own 
hardware.
  設(shè)備驅(qū)動(dòng)是一些訪問硬件的底層操作,µC/FS的設(shè)備驅(qū)動(dòng)的架構(gòu)很簡(jiǎn)單,不像linux架構(gòu)非常復(fù)雜。
 
4: uC/FS的使用
   下面的流程是參考uC/FS用戶手冊(cè)上的例程來(lái)寫的,可以參考。
   1:調(diào)用FS_Init()初始化文件系統(tǒng),在使用uC/FS的任何功能函數(shù)之前須要首先調(diào)用該函數(shù)進(jìn)行初始        化;
   2:進(jìn)入MainTask()
           1:調(diào)用FS_IoCtl()【格式化:使硬件按指定的文件系統(tǒng)來(lái)管理文件】
              This call is used to format your RAM disk in order to be able to write data to                     it. Formatting your RAM disk should not cause any problem.
           2:調(diào)用應(yīng)用程序中的函數(shù)_write_file()【非uc/fs的函數(shù)】
                 _write_file()中又依次調(diào)用: FS_FOpen(), FS_FWrite(),FS_FClose()
              FS_FOpen():在這個(gè)例程中FS_FOpen()創(chuàng)建了一個(gè)叫default.txt的文件,如果創(chuàng)建成功,函數(shù)                           將返回一個(gè)FS_FILE結(jié)構(gòu)體的指針,如果出錯(cuò)將返回0
              FS_FWrite():文件創(chuàng)建成功之后,將一串字符串寫入該文件中,如果寫入時(shí)出錯(cuò),例程中調(diào)                              FS_FError()處理錯(cuò)誤。
              FS_FClose():關(guān)閉上面打開的文件,返回主任務(wù)中
    【大致過程就是如上過程】
     讀: FS_FOpen()->FS_FRead()->FS_FClose()
   3:不使用uC/FS文件管理系統(tǒng)時(shí)調(diào)用FS_Exit().


5: uC/FS加入到工程中
   1:Create a simple project without µC/FS 
      We recommend, that you create a small “hello world” program for your system. That project should already use your OS and there should be a way to display text on a screen or serial port. 
   2: Add your µC/FS configuration
      In order to configure  µC/FS for your system, you should create a new sub-directory in µC/FS’s config directory and copy the files  fs_conf.h  and fs_port.h from one of the other sub-directories to your directory. For the following chapters, we assume that you have created a directory FS\CONFIG\myconfig. Usually, the only file  you have to modify is fs_conf.h. For an easy startup, we recommend, that you disable all drivers except the RAM disk driver. Please check out the chapter “Configuration of µC/FS” for detailed information about the configuration.  
   3Add µC/FS generic source code 
     Add all source files in the following directories:
        FS\API: µC/FS提供給用戶的接口函數(shù)
        FS\FSL: 具體的文件系統(tǒng)層
        FS\LBL: 邏輯塊層 
        FS\OS :
        FS\DEVICE\RAM 
     and their sub-directories to your project.  
   4Configure the search path[為開發(fā)環(huán)境添加所以代碼的路徑]
        FS\API 
        FS\CONFIG\myconfig 
        FS\LBL 
        FS\OS
   5Add generic sample code
       For a quick and easy test of your µC/FS integration, you should use the code 
       found in FS\sample\main.c.  
 
6: uC/FS配置
 1:fs_conf.h
     This is the main configuration file for the file system. You define which drivers you want to use and, the configurations for these drivers.
      【用戶手冊(cè)中列出了一個(gè)配置樣本】,包括下面的各個(gè)配置項(xiàng)目
    1:OS support 
      You can specify whether you are using uC/OS-II, embOS, Windows or no OS support at all.  Please set  FS_OS_UCOS_II,  FS_OS_EMBOS, FS_OS_WINDOWS to 1, respectively. For no OS support at all, set all of them to 0. If you need support for an additional OS, you will have to provide functions described in the chapter “OS integration”. 
    2:Time/Date support 
      If you want to be able to add date and times to your files, you will need to set 
FS_OS_TIME_SUPPORT  to 1. 
    3:File System Layer Support
      µC/FS can support different file system at the same time. You can enable them by setting FS_USE_XXX_FSL, where XXX is the name of the file system layer. The current version of µC/FS only supports the FAT file system, so you will need to set FS_USE_FAT_FSL to 1.
   4:Device Driver Support and configuration
I      RAM Disk:     
      FS_USE_RAMDISK_DRIVER 
 to  1
       Windows Driver:    FS_USE_WINDRIVE_DRIVER to 1     
       Smart Media Card(SMCs): 
                          FS_USE_SMC_DRIVER  to 1
       MultiMedia card:
             µC/FS can support  MultiMedia & SD cards. You can enable the driver by setting FS_USE_MMC_DRIVER to 1. In order to use it, you will have to provide low-level I/O functions for your card reader hardware. Please take a look at the chapter “MultiMedia & SD card device driver” for details. 
      CompactFlash card & IDE:FS_USE_IDE_DRIVER to 1
 
 2:fs_port.h【一般是與CPU相關(guān)的數(shù)據(jù)類型】
      Usually this file only requires minor modifications, if you are using a very specific CPU. Please also check the type declarations in this file to ensure that they fit with your target processor and compiler. 

6: API函數(shù)說(shuō)明
 
  FS_IoCtl:執(zhí)行命令(SD卡等可以通過電腦格式化)
 
  x = FS_IoCtl("ram:",FS_CMD_FORMAT_MEDIA,FS_MEDIA_RAM_16KB,0);

  Directory functions
  int FS_CloseDir(FS_DIR *dirp);
  int FS_MkDir(const char *dirname);
  FS_DIR *FS_OpenDir(const char *dirname);
  struct FS_DIRENT *FS_ReadDir(FS_DIR *dirp);
  void FS_RewindDir(FS_DIR *dirp); 
  int FS_RmDir(const char *dirname); 

7: 設(shè)備驅(qū)動(dòng)Device drivers
  µC/FS可以與任何種類的硬件配合工作;µC/FS需要配備與硬件設(shè)備對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序,這些設(shè)備驅(qū)動(dòng)程序包含 基本的訪問硬件的I/O函數(shù) 以及 一張全局表,這張表中存放各個(gè)函數(shù)的指針!韭(lián)想到LINUX中系統(tǒng)調(diào)用的系統(tǒng)調(diào)用號(hào)】
  要使你的µC/FS支持特定的硬件設(shè)備,你必須寫好該設(shè)備的驅(qū)動(dòng),本節(jié)告訴你需要實(shí)現(xiàn)哪些函數(shù)以及怎么樣將驅(qū)動(dòng)整合到µC/FS中去。
   【下面是ramdisk的設(shè)備驅(qū)動(dòng)函數(shù)表的例子:設(shè)備驅(qū)動(dòng)函數(shù)表中的各個(gè)函數(shù),在PDF中已給出具體的代碼,其他的設(shè)備,如MMC&SD也是類似的,需要提供這相關(guān)的幾個(gè)函數(shù),名字可以不同,在功能函數(shù)的次序要一樣】
   

 
  In this chapter, you will find a detailed description of the device driver functions required by µC/FS. Please note that the names used for these functions are not really relevant for  µC/FS because the file system accesses those functions through a function table.
  因?yàn)槭峭ㄟ^一張全局表來(lái)管理各個(gè)設(shè)備驅(qū)動(dòng)函數(shù),所以各設(shè)備驅(qū)動(dòng)函數(shù)的名稱與µC/FS沒有太多的關(guān)聯(lián)性。
  _FS_DevIoCtl():Execute special command on device.
     static int _FS_DevIoCtl(FS_u32 id, FS_i32 cmd, FS_i32 aux,void *buffer);  
                             Parameter  Meaning 
                             id         Number of media (0…N) 
                             cmd        Command 
                             aux        Parameter for command 
                             buffer     Pointer to data required by command
     該函數(shù)被用來(lái)完成一些設(shè)備驅(qū)動(dòng)中特殊的命令,對(duì)uc/FS來(lái)說(shuō)目前需要支持的這類特殊命令有:FS_CMD_FLUSH_CACHE,這個(gè)命令用來(lái)告訴設(shè)備的緩沖邏輯 所有的緩沖必須清零,如果你的設(shè)備沒有緩沖邏輯,該函數(shù)不需要做任何事情。
  _FS_DevRead():Read block from media 
      static int _FS_DevRead(FS_u32 id, FS_u32 block, void *buffer); 
                             id      Number of media (0…N) 
                             block   Block number to be read from the media 
                             buffer  Data buffer to which the data is transferred
   The function should transfer 0x0200 (i.e. 512) bytes, which is the default value for an MS-DOS/MS-Windows compatible FAT file systems. µC/FS can support any block size but, if you use the FAT file system layer, you have to use this default block size. 
   函數(shù)應(yīng)該傳送0x0200(512)個(gè)字節(jié),這個(gè)是兼容FAT文件系統(tǒng)的MS-DOS/MS-Windows系統(tǒng)的默認(rèn)值,µC/FS能支持任何大小的塊,但是如果你的文件系統(tǒng)層使用FAT,那么你必須使用這個(gè)默認(rèn)的塊大小。
  _FS_DevStatus():Return current status of your device. 
     static int _FS_DevStatus(FS_u32 id); id  Number of media (0…N) 
   The main purpose of this function is to detect a media change. All µC/FS file operation calls this function to check, if the device can be accessed. 
  該函數(shù)的主要目的是檢測(cè)一個(gè)介質(zhì)的改變。如果一個(gè)設(shè)備能夠被訪問,所有的µC/FS 文件操作都調(diào)用這個(gè)函數(shù)進(jìn)行檢測(cè),
   The function returns 0 if the device can be accessed. If the media has changed (e.g. a card removed or replaced) and the device can be accessed, the return value has to be FS_LBL_MEDIACHANGED. Any value < 0 is interpreted as an error. 
  _FS_DevWrite():Write block to media 
      static int _FS_DevWrite(FS_u32 id, FS_u32 block,void *buffer);
                              id      Number of media (0…N) 
                              block   Block number to be written on media 
                              buffer  Pointer to data for transfer to the media. 
      The function should transfer 0x0200 (i.e. 512) bytes, which is the default value for an MS-DOS/MS-Windows compatible FAT file systems. µC/FS can support any block size but, if you use the FAT file system layer, you have to use this default block size. 

  Device driver function table
   To use a device driver with µC/FS, a global function table is required, which  
holds pointers to the device driver functions.  Each entry in the table contains 
 
five values as shown in the example below. 
     const FS__device_type FS__ramdevice_driver = { 
       "RAMDISK device", 
       _FS_DevStatus, 
       _FS_DevRead, 
       _FS_DevWrite, 
       _FS_DevIoCtl 
     }; 
    If you want to use your own device driver, you have to tell µC/FS, which device 
name you would like to use for your device and which  File System Layer 
(currently only FAT is supported) you want to use. 
    You do this by setting appropriate value for FS_DEVINFO in your FS_conf.h , 
which is used to initialize µC/FS’s global device information table.  
   如果你想要使用自己的設(shè)備驅(qū)動(dòng),你必須要告訴μC/FS,你的設(shè)備使用的是哪一個(gè)設(shè)備名稱以及使用哪一個(gè)文件系統(tǒng)來(lái)管理(目前只支持FAT)。
   可以將 FS_conf.h中的FS_DEVINFO 設(shè)置一個(gè)合適的值來(lái)完成上面的動(dòng)作,FS_DEVINFO被用來(lái)初始化μC/FS的全局設(shè)備信息表。
 【上面是ramdisk的設(shè)備驅(qū)動(dòng)函數(shù)表的例子,_FS_DevStatus, _FS_DevRead, _FS_DevWrite, 
 _FS_DevIoCtl,就是ramdisk所需的底層驅(qū)動(dòng)函數(shù)
  這里如果是MMC&SD存儲(chǔ)設(shè)備,下面是源碼。
#ifndef FS_DEVINFO
 #if FS_USE_SMC_DRIVER
   #define FS_DEVINFO_DEVSMC     
      {"smc",&FS__fat_functable,&FS__smcdevice_driver,FS_CACHEINFO_SMC_DRIVER 0 },
 #else
   #define FS_DEVINFO_DEVSMC
 #endif
 
 #if FS_USE_MMC_DRIVER
   #define FS_DEVINFO_DEVMMC     
     {"mmc", &FS__fat_functable,&FS__mmcdevice_driver, FS_CACHEINFO_MMC_DRIVER 0 },
 #else
   #define FS_DEVINFO_DEVMMC
 #endif
 ......
 #endif

從源碼中可以看出,如果沒有定義 
FS_DEVINFO宏,且如果沒有定義
 FS_DEVINFO_DEVSMC,系統(tǒng)會(huì)自動(dòng)以FS_DEVINFO_DEVSMC,即采用系統(tǒng)默認(rèn)的設(shè)備驅(qū)動(dòng)。
我們可以在fs_conf.h中配置   
FS_USE_MMC_DRIVER = 1;再定義 
#define FS_DEVINFO \ 
        "mmc",    &FS__fat_functable, &FS__mmcdevice_driver, 0,
FS_USE_MMC_DRIVER = 1,即使沒有定義
 FS_DEVINFO,系統(tǒng)也會(huì)有一個(gè)默認(rèn)的定義
FS__fat_functable:這個(gè)表不用填充,因?yàn)檫@里面的函數(shù)在API層已經(jīng)實(shí)現(xiàn),且系統(tǒng)已經(jīng)設(shè)置好。用戶只需更改FS__mmcdevice_driver里面的各個(gè)函數(shù)即可。
 
【這里支持多個(gè)設(shè)備"smc"和"mydev"
#define FS_DEVINFO \ 
        "smc",    &FS__fat_functable, &FS__smcdevice_driver, 0, \ 
        "mydev",  &FS__fat_functable, &FS__mydevice_driver , 0 
【如果不指定,系統(tǒng)將使用默認(rèn)值】
   The first parameter is a device name, which you want to use for  µC/FS’s API 
calls.  
   The second parameter is a pointer to a  File System Layer function table; 
currently only FAT is supported.  
   The third parameter is a pointer to a Device Driver function table.  
   The last parameter is reserved for future use and should be zero. 
 
8: 各目錄介紹 

在工程中添加上面的文件組:API層、FAT層、LBL層、DEV層、OS、CLIB
DEV包含的就是文件系統(tǒng)需要使用的最底層的操作硬件的接口,
這里使用文件系統(tǒng)標(biāo)準(zhǔn)的操作接口:_FS_XXX_Devxxx(....):在這幾個(gè)函數(shù)中調(diào)用具體的SD卡的操作函數(shù)來(lái)實(shí)現(xiàn)與硬件驅(qū)動(dòng)的鏈接。
CLIB中包含的是文件系統(tǒng)使用的一些C標(biāo)準(zhǔn)函數(shù)。
OS組中包含的文件fs_x_ucos_ii.c中包含的就是一些函數(shù)接口,這些接口是連接操作系統(tǒng)的接口(當(dāng)然在裸機(jī)下也是這些接口),如果使用操作系統(tǒng),這些函數(shù)接口中 就是與操作系統(tǒng)相關(guān)的代碼,如果沒有操作系統(tǒng),這些接口就是很簡(jiǎn)單的一些與系統(tǒng)無(wú)關(guān)的代碼,總之是文件系統(tǒng)是需要這些接口(有無(wú)操作系統(tǒng)接口是一樣的);
各接口函數(shù)如下:
FS_X_OS_Init:創(chuàng)建一些文件系統(tǒng)運(yùn)行時(shí)需要使用的一些信號(hào)量(用來(lái)訪問資源)
FS_X_OS_Exit:刪除上面創(chuàng)建的各信號(hào)量
其他的都是配對(duì)的Lock/Unlock,也就是申請(qǐng)獲取一個(gè)對(duì)應(yīng)的信號(hào)量,使用后再釋放這個(gè)信號(hào)量。
就是這么簡(jiǎn)單。
 
9: MultiMedia & SD card device driver 
   µC/FS includes a generic driver for MultiMedia & SD cards. The driver accesses 
cards using SPI mode.
   µC/FS包含一個(gè)針對(duì)MMC/SD卡的通用驅(qū)動(dòng),該驅(qū)動(dòng)通過SPI模式訪問卡。
   To use the driver in your system, you will have to provide basic I/O functions for 
accessing your card reader hardware. You can find samples of these routines in 
the directory device\mmc_sd\hardware. 
   在你的系統(tǒng)中使用該驅(qū)動(dòng)時(shí),你必須要提供基本的能訪問你的讀卡器硬件的I/O函數(shù)。你可以在“device\mmc_sd\hardware”路徑下找到例子。
   【在源代碼的目錄中官方提供了相關(guān)設(shè)備的通用底層驅(qū)動(dòng)的例程】
   [下面藍(lán)色的就是官方提供的MMC&SD卡的通用驅(qū)動(dòng),但是需要你提供基本的IO訪問函數(shù)]
   [在device\xxx\hardware目錄下,存放的就是對(duì)應(yīng)的xxx設(shè)備的通用驅(qū)動(dòng),                smc_X_hw.c、smc_X_hw.h]
   FS_MMC_HW_X_BusyLedOff():Turns off busy LED of the card reade
       void FS_MMC_HW_X_BusyLedOff(FS_u32 id); 
       id:ID of card reader (0…N).
   FS_MMC_HW_X_BusyLedOn():Turns on busy LED of the card reader.
       void FS_MMC_HW_X_BusyLedOn (FS_u32 id); 
       id:ID of card reader (0…N). 
   FS_MMC_HW_X_ClockCard() 
   FS_MMC_HW_X_SetCS()
   FS_MMC_HW_X_AdjustFOP() 
   FS_MMC_HW_X_CheckOCR()
   FS_MMC_HW_X_GetFOP() 
   FS_MMC_HW_X_CheckWP() 
   FS_MMC_HW_X_DetectStatus()
   FS_MMC_HW_X_WaitBusy() 
   FS_MMC_HW_X_ReadByte()
   FS_MMC_HW_X_ReadByteNoSync()  
   FS_MMC_HW_X_ReadSingleBlock() 
   FS_MMC_HW_X_WriteByte() 
   FS_MMC_HW_X_WriteByteSingleBlock()
關(guān)閉窗口
主站蜘蛛池模板: 夜夜爽99久久国产综合精品女不卡 | 91热在线| 天天操夜夜操 | 人人看人人射 | 中文字幕a√ | 国产精品国产三级国产aⅴ无密码 | 玖玖操| 日韩一区二区三区在线观看 | 98成人网 | 理伦毛片 | 午夜精品久久久久久久久久久久久 | 中文字幕视频在线观看 | 日韩成人在线视频 | 日本一区二区不卡视频 | 一区二区视频免费观看 | 精品久久久久久亚洲国产800 | 国产亚洲精品久久久久动 | 精品视频一区二区三区 | 国产午夜精品视频 | 91精品国产91久久久久福利 | 久久精品小短片 | 日韩欧美一区二区三区在线播放 | 天天射天天干 | 九九伊人sl水蜜桃色推荐 | 成人亚洲一区 | 欧美精品久久久久 | 亚洲国产精品一区 | 亚洲第一av网站 | 91免费在线视频 | 在线视频成人 | 在线 丝袜 欧美 日韩 制服 | 综合久久一区 | 在线āv视频 | 操操日| 精品日韩在线观看 | 久久久视 | www.国产| 免费麻豆视频 | 成人精品国产 | 亚洲va国产日韩欧美精品色婷婷 | 在线观看成人av |