《電子技術(shù)應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 單片機自編程及Bootloader設計
單片機自編程及Bootloader設計
摘要: Bootloader是在單片機上電啟動時執(zhí)行的一小段程序。也稱作固件,通過這段程序,可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用應用程序準備好正確的環(huán)境。
Abstract:
Key words :

  Bootloader是在單片機上電啟動時執(zhí)行的一小段程序。也稱作固件,通過這段程序,可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用應用程序準備好正確的環(huán)境。

  Boot代碼由MCU啟動時執(zhí)行的指令組成。這里的loader指向MCU的Flash中寫入新的應用程序。因此,Bootloader是依賴于特定的硬件而實現(xiàn)的,因此,在眾多嵌入式產(chǎn)品中目前還不可能實現(xiàn)通用Bootloader。

  Bootloader的最大優(yōu)點是:在不需要外部編程器的情況下,對嵌入式產(chǎn)品的應用代碼進行更新升級。它使得通過局域網(wǎng)或者Intemet遠程更新程序成為可能。例如,如果有5 000個基于MCU的電能表應用程序需要更新,電能表制造商的技術(shù)人員就可以避免從事對每一個電能表重新編程的巨大工作量,通過使用Bootloader的功能,由控制中心通過電能表抄表系統(tǒng)網(wǎng)絡,遠程對5 000個電表重新編程。可見,Bootloader功能對于嵌入式系統(tǒng)的廣泛應用具有十分重要的意義。

  1 78K0/Fx2系列單片機簡介

  78K0/Fx2系列是帶CAN控制器的8位單片機,該系列單片機廣泛應用于汽車電子,智能儀表等領域。其內(nèi)置POC(可編程上電清零電路)/LVI(可編程低電壓指示器),單電壓自編程閃存,引導交換功能(閃存安全保護),具有低功耗、寬電壓范圍、超高抗干擾等性能。

  78K0系列單片機支持自編程(Self-programming)。所謂自編程,是指用Flash存儲器中的駐留的軟件或程序?qū)lash存儲器進行擦除/編程的方法。通過單片機的自編程功能,可以設計Bootloader程序,通過串口等通信接口實現(xiàn)對產(chǎn)品重新編程、在線升級的功能。

  以μPD78F0881為例。μPD78F0881為78KO/Fx2系列中的一款44管腳單片機,內(nèi)置32 KB Flash ROM,2 KB RAM,自帶2個串行通信接口。其內(nèi)部Flash結(jié)構(gòu)如圖1所示。為了方便實現(xiàn)擦除和編程,人為地將整個Flash分成若干個block,每個block大小為1 KB。block為自編程庫函數(shù)中空白檢測、擦除、校驗的最小單位。blockO從地址0000H開始,程序都從0000H開始執(zhí)行。block0~block3共4 KB存儲空間為Bootloader程序存儲區(qū)域。block4~block31為應用程序存儲區(qū)域。

  

  為了防止Bootloader自身的升級失敗,設計了引導交換功能。該功能定義2個簇,即Boot cluster0和Boot cluster1。Boot clustee0為block0~block3的4 KB存儲空間,Boot cluster1為block4~block7的4 KB存儲空間。因此,實際運用過程中,一般把應用程序的開始定義在2000H,也就是從block8開始。

  Flash地址為0000H~FFFFH。7FFFFH~FFFFH存儲空間為保留區(qū)域以及特殊功能寄存器區(qū)域等,用戶無法對其進行編程。

  2 自編程

  2.1 自編程環(huán)境

  2.1.1 硬件環(huán)境

  FLMDO引腳是78KO/Fx2系列單片機為Flash編程模式設置的,用于控制MCU進入編程模式。在通常操作情況下,F(xiàn)LMDO引腳下拉到地。要進入自編程模式,必須使FLMDO引腳置成高電平。因此,通過一個普通I/O接口控制FLMD0引腳的電平。如圖2所示。

  

  2.1.2 軟件環(huán)境

  1)使用通用寄存器bank3,自編程庫函數(shù),需要調(diào)用通用寄存器bank3。因此,在自編程時,不能對通用寄存器bank3操作。

  2)使用100 B RAM(入口RAM)作為隱藏ROM中函數(shù)的工作區(qū),入口RAM,是Flash存儲器自編程樣例庫所使用的RAM區(qū)域。用戶程序需要保留著塊區(qū)域,當調(diào)用庫時,需要指定這片區(qū)域的起始地址。入口RAM地址可以指定在FB00h~FE20h之間。

  3)4~256 B RAM作為數(shù)據(jù)緩沖區(qū),必須是FE20H~FE83H以外的內(nèi)部高速RAM區(qū)域。

  4)最大39 B RAM作為隱藏ROM函數(shù)的堆棧。

  5)隱藏ROM中的函數(shù)被0000H~7FFFH中的應用程序調(diào)用。

  2.2 自編程流程

  自編程功能利用自編程軟件庫完成用戶程序?qū)lash內(nèi)容的重新編程。如果在自編程的過程中有中斷發(fā)生,那么自編程將暫停來響應中斷。中斷結(jié)束,自編程模式恢復后,自編程過程將繼續(xù)進行。采用匯編語言編寫78K0/Fx2自編程軟件庫,如表1所示。

  

  自編程操作流程如圖3所示,當單片機收到自編程執(zhí)行信號時,開始進入自編程模式。將FLMDO引腳設置成高電平,初始化入口RAM,為自編程庫函數(shù)開辟空間。當確認FLMD0為自編程狀態(tài)時,開始檢查需要編程區(qū)域是否為空白區(qū)域。當被編程區(qū)域不是空白區(qū)域時,先將其擦除,然后在此區(qū)域進行編程。編程結(jié)束后進行校驗。若校驗無誤,則將FLMDO引腳設置成低電平,退出自編程模式。

  

  3 引導交換(boot swap)

  產(chǎn)品程序的升級包括應用程序的升級和引導程序(Bootloader自身)的升級。為了防止引導程序在升級的過程中發(fā)生錯誤,從而導致MCU無法啟動,設計了引導交換功能。以圖4說明引導交換的實現(xiàn)過程。

  

  1)舊的Boot程序首先將新的Boot程序編程到交換引導簇1(Boot cluster 1),然后設置啟動交換標志位,并強迫看門狗復位。

  2)復位啟動后,MCU看到交換標志位,便從交換引導簇1處開始啟動。交換引導簇1處的新Boot程序?qū)z查交換標志位。如果交換標志位被置1,則新的Boot程序?qū)⒉脸粨Q引導簇0(Boot cluster 0)區(qū)域,并將自身復制到交換引導簇O,然后將交換標志位清零,強迫看門狗復位。

  3)復位啟動后,MCU看到交換標志位被清零。又從交換引導簇0處開始執(zhí)行。這樣就完成了boot程序自身的升級。即使在升級過程中遇到斷電等異常情況,在重新上電后也能重新完成Boot程序升級。有效地防止在升級過程中出現(xiàn)斷電等等異常情況而導致升級失敗,MCU無法啟動的問題,使Boot程序的升級變得安全可靠。

  Bootloader是在單片機上電啟動時執(zhí)行的一小段程序。也稱作固件,通過這段程序,可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用應用程序準備好正確的環(huán)境。

  Boot代碼由MCU啟動時執(zhí)行的指令組成。這里的loader指向MCU的Flash中寫入新的應用程序。因此,Bootloader是依賴于特定的硬件而實現(xiàn)的,因此,在眾多嵌入式產(chǎn)品中目前還不可能實現(xiàn)通用Bootloader。

  Bootloader的最大優(yōu)點是:在不需要外部編程器的情況下,對嵌入式產(chǎn)品的應用代碼進行更新升級。它使得通過局域網(wǎng)或者Intemet遠程更新程序成為可能。例如,如果有5 000個基于MCU的電能表應用程序需要更新,電能表制造商的技術(shù)人員就可以避免從事對每一個電能表重新編程的巨大工作量,通過使用Bootloader的功能,由控制中心通過電能表抄表系統(tǒng)網(wǎng)絡,遠程對5 000個電表重新編程。可見,Bootloader功能對于嵌入式系統(tǒng)的廣泛應用具有十分重要的意義。

  1 78K0/Fx2系列單片機簡介

  78K0/Fx2系列是帶CAN控制器的8位單片機,該系列單片機廣泛應用于汽車電子,智能儀表等領域。其內(nèi)置POC(可編程上電清零電路)/LVI(可編程低電壓指示器),單電壓自編程閃存,引導交換功能(閃存安全保護),具有低功耗、寬電壓范圍、超高抗干擾等性能。

  78K0系列單片機支持自編程(Self-programming)。所謂自編程,是指用Flash存儲器中的駐留的軟件或程序?qū)lash存儲器進行擦除/編程的方法。通過單片機的自編程功能,可以設計Bootloader程序,通過串口等通信接口實現(xiàn)對產(chǎn)品重新編程、在線升級的功能。

  以μPD78F0881為例。μPD78F0881為78KO/Fx2系列中的一款44管腳單片機,內(nèi)置32 KB Flash ROM,2 KB RAM,自帶2個串行通信接口。其內(nèi)部Flash結(jié)構(gòu)如圖1所示。為了方便實現(xiàn)擦除和編程,人為地將整個Flash分成若干個block,每個block大小為1 KB。block為自編程庫函數(shù)中空白檢測、擦除、校驗的最小單位。blockO從地址0000H開始,程序都從0000H開始執(zhí)行。block0~block3共4 KB存儲空間為Bootloader程序存儲區(qū)域。block4~block31為應用程序存儲區(qū)域。

  

  為了防止Bootloader自身的升級失敗,設計了引導交換功能。該功能定義2個簇,即Boot cluster0和Boot cluster1。Boot clustee0為block0~block3的4 KB存儲空間,Boot cluster1為block4~block7的4 KB存儲空間。因此,實際運用過程中,一般把應用程序的開始定義在2000H,也就是從block8開始。

  Flash地址為0000H~FFFFH。7FFFFH~FFFFH存儲空間為保留區(qū)域以及特殊功能寄存器區(qū)域等,用戶無法對其進行編程。

  2 自編程

  2.1 自編程環(huán)境

  2.1.1 硬件環(huán)境

  FLMDO引腳是78KO/Fx2系列單片機為Flash編程模式設置的,用于控制MCU進入編程模式。在通常操作情況下,F(xiàn)LMDO引腳下拉到地。要進入自編程模式,必須使FLMDO引腳置成高電平。因此,通過一個普通I/O接口控制FLMD0引腳的電平。如圖2所示。

  

  2.1.2 軟件環(huán)境

  1)使用通用寄存器bank3,自編程庫函數(shù),需要調(diào)用通用寄存器bank3。因此,在自編程時,不能對通用寄存器bank3操作。

  2)使用100 B RAM(入口RAM)作為隱藏ROM中函數(shù)的工作區(qū),入口RAM,是Flash存儲器自編程樣例庫所使用的RAM區(qū)域。用戶程序需要保留著塊區(qū)域,當調(diào)用庫時,需要指定這片區(qū)域的起始地址。入口RAM地址可以指定在FB00h~FE20h之間。

  3)4~256 B RAM作為數(shù)據(jù)緩沖區(qū),必須是FE20H~FE83H以外的內(nèi)部高速RAM區(qū)域。

  4)最大39 B RAM作為隱藏ROM函數(shù)的堆棧。

  5)隱藏ROM中的函數(shù)被0000H~7FFFH中的應用程序調(diào)用。

  2.2 自編程流程

  自編程功能利用自編程軟件庫完成用戶程序?qū)lash內(nèi)容的重新編程。如果在自編程的過程中有中斷發(fā)生,那么自編程將暫停來響應中斷。中斷結(jié)束,自編程模式恢復后,自編程過程將繼續(xù)進行。采用匯編語言編寫78K0/Fx2自編程軟件庫,如表1所示。

  

  自編程操作流程如圖3所示,當單片機收到自編程執(zhí)行信號時,開始進入自編程模式。將FLMDO引腳設置成高電平,初始化入口RAM,為自編程庫函數(shù)開辟空間。當確認FLMD0為自編程狀態(tài)時,開始檢查需要編程區(qū)域是否為空白區(qū)域。當被編程區(qū)域不是空白區(qū)域時,先將其擦除,然后在此區(qū)域進行編程。編程結(jié)束后進行校驗。若校驗無誤,則將FLMDO引腳設置成低電平,退出自編程模式。

  

  3 引導交換(boot swap)

  產(chǎn)品程序的升級包括應用程序的升級和引導程序(Bootloader自身)的升級。為了防止引導程序在升級的過程中發(fā)生錯誤,從而導致MCU無法啟動,設計了引導交換功能。以圖4說明引導交換的實現(xiàn)過程。

  

  1)舊的Boot程序首先將新的Boot程序編程到交換引導簇1(Boot cluster 1),然后設置啟動交換標志位,并強迫看門狗復位。

  2)復位啟動后,MCU看到交換標志位,便從交換引導簇1處開始啟動。交換引導簇1處的新Boot程序?qū)z查交換標志位。如果交換標志位被置1,則新的Boot程序?qū)⒉脸粨Q引導簇0(Boot cluster 0)區(qū)域,并將自身復制到交換引導簇O,然后將交換標志位清零,強迫看門狗復位。

  3)復位啟動后,MCU看到交換標志位被清零。又從交換引導簇0處開始執(zhí)行。這樣就完成了boot程序自身的升級。即使在升級過程中遇到斷電等異常情況,在重新上電后也能重新完成Boot程序升級。有效地防止在升級過程中出現(xiàn)斷電等等異常情況而導致升級失敗,MCU無法啟動的問題,使Boot程序的升級變得安全可靠。

  4 Bootloadler設計

  4.1 簡單的Bootloader

  一個簡單的Bootload包括5個元素。

  1)啟動 Bootloader的信號 Bootloader程序是在執(zhí)行應用程序之前所執(zhí)行的一小段程序,當Bootloader程序把控制權(quán)轉(zhuǎn)交給應用程序后,在MCU復位前,Bootloader程序?qū)⒉辉賵?zhí)行。因此,需要產(chǎn)生一個信號觸發(fā)MCU開始Bootloader程序。該信號可以是中斷,也可以通過串口傳送的一條指令,或者是別的程序觸發(fā)的信號。

  2)執(zhí)行 Bootloader的信號 單片機程序啟動時,MCU是裝載新的應用程序還是執(zhí)行已經(jīng)存在的程序取決于外部信號。該信號可以是上電時的一個端口信號,用來控制MCU裝載新程序還是執(zhí)行舊程序,也可以是從串口接收到的指令等。

  3)將新的代碼傳送給MCU 通過RS485、I2C、CAN或者USB傳送新的應用程序數(shù)據(jù)。因為要傳送的代碼一般會超過MCU的RAM容量,因此需要一些控制數(shù)據(jù)流量的措施。一般使用XON/XOFF軟件握手協(xié)議,傳送代碼的格式一般選擇Intel hex格式。

  4)Flash新代碼的自動編程 每次MCU接收到一批新的數(shù)據(jù),就要將其編程到正確的Flash地址。如果該地址非空白,MCU在編程前必須先擦除。一般在編程中或者編程后還需要檢查存儲器的內(nèi)容。

  5)將控制權(quán)轉(zhuǎn)移給有效的應用程序 在接收和編程了新的代碼后,Bootloader寫一個校驗和或者其他唯一字節(jié)序列到一個固定的存儲單元。Bootloader檢測該值,如果該值存在,Bootloader就將控制權(quán)傳給應用程序。

  4.2 Intelhex格式

  在線升級的程序代碼采用編譯器輸出的Intel hex格式文件。Intel hex文件常用來保存單片機或其他微處理器的程序代碼。它保存物理程序存儲區(qū)中的目標代碼映象。一般的編程器都支持這種格式。Intel hex文件記錄中的數(shù)字都是十六進制格式。在InteI hex文件中,每一行包含一個HEX記錄。Intel hex文件通常用于傳輸將被存于Flash或者EEPROM中的程序和數(shù)據(jù)。Intel hex由任意數(shù)量的十六進制記錄組成。每個記錄包含5個域,它們按照圖5所示格式排列。

  

  每一個部分至少由2個十六進制編碼字符組成。它們構(gòu)成1個字節(jié)。每一個部分的意義如下所述:

  1)每個Intel hex記錄都由冒號開頭,自編程的過程中以此判斷一個Intel hex記錄的開始。

  2)數(shù)據(jù)長度代表當前記錄中數(shù)據(jù)字節(jié)的數(shù)量。

  3)地址代表當前記錄中數(shù)據(jù)在存儲區(qū)域中的起始地址。

  4)HEX記錄類型有如下4種:00-數(shù)據(jù)記錄;01-文件結(jié)束記錄;02-擴展段地址記錄;03-轉(zhuǎn)移地址記錄。NEC編譯器輸出的Intel hex文件中。只包含數(shù)據(jù)類型00和01。其中O1作為自編程過程中數(shù)據(jù)結(jié)束的判定標志。

  5)數(shù)據(jù)域分用于存儲需要寫入Flash中的內(nèi)容,一個記錄可以有許多數(shù)據(jù)字節(jié)。記錄中的數(shù)據(jù)字節(jié)數(shù)量必須與數(shù)據(jù)長度中的值相符。

  6)校驗和是取記錄中從數(shù)據(jù)長度到數(shù)據(jù)域最后一個字節(jié)的所有字節(jié)總和的2的補碼。

  根據(jù)以上說明,必須在程序中對接收到的Inter hex文件進行解碼,獲取數(shù)據(jù)以及數(shù)據(jù)地址,并對收到的數(shù)據(jù)進行校驗,然后將接收正確的數(shù)據(jù)編程到Flash相應的地址上。

  4.3 Bootloader設計思路

  單片機收到啟動信號后,重新啟動程序。啟動的時候首先執(zhí)行Boot代碼,Boot代碼檢查是否收到執(zhí)行升級信號。如果需要升級程序,則通過串口或者其他通信接口接收新的應用程序,loader程序向單片機Flash中寫入新的應用程序代碼。最后通過檢查校驗位檢測程序是否有效。如果有效,則Bootloader將CPUMCU控制權(quán)交給應用程序。整個升級過程完成。Bootloader執(zhí)行過程如圖6所示。

  

  需要注意的是Bootloader自身的更新和應用程序的更新還需區(qū)別處理。通過辨別接收到數(shù)據(jù)的編程地址來判斷是Bootloader更新還是應用程序更新。若編程地址從0000H開始,則為Bootloader更新。Bootloader更新則需要執(zhí)行引導交換(boot swap)功能;若為應用程序更新,自編程結(jié)束后,直接將CPU交給應用程序。

  5 結(jié)束語

  本文探討了78KO/FC2系列μPD78F0881單片機的自編程功能以及Bootloader的設計方法。具體描述了通過單片機串口對相應的應用程序通過Bootloader進行升級。此版本的Bootloader使用晶振20 MHz,通過串口Uart60,設置波特率為115 200,在μPD78F0881單片機上成功實現(xiàn)了用戶應用程序的升級更新。在接下來的工作中,Bootloader的設計應當面向更多的通信接口。例如,通過CAN總線接口升級,通過USB接口升級等等。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
一区二区成人精品| 亚洲你懂的在线视频| 亚洲欧洲另类| 狠狠色狠狠色综合日日tαg | 亚洲国产精品视频| 亚洲在线不卡| 亚洲视频图片小说| 亚洲少妇最新在线视频| 夜久久久久久| 在线视频亚洲| 亚洲一级二级在线| 亚洲一区二区三区免费在线观看| 亚洲精品国产日韩| 亚洲三级色网| av不卡免费看| 一区二区三区偷拍| 一区二区av在线| 亚洲系列中文字幕| 亚洲欧美一区二区原创| 亚洲一级网站| 午夜一区二区三视频在线观看| 在线亚洲一区二区| 亚洲免费在线精品一区| 欧美一区二区网站| 亚洲国产精品一区在线观看不卡 | 亚洲美女av网站| 亚洲精选在线观看| 99精品视频一区二区三区| 一本在线高清不卡dvd| 亚洲图片欧洲图片av| 亚洲女人小视频在线观看| 欧美一级在线亚洲天堂| 久久久久免费视频| 欧美肥婆在线| 国产精品成人观看视频免费| 国产精品自拍在线| 韩国av一区二区三区四区| 亚洲国产精品一区二区www在线| 伊人久久综合| 亚洲精品影院| 午夜精品福利视频| 亚洲国产一区二区三区高清| 99精品国产高清一区二区| 亚洲在线中文字幕| 久久久久综合一区二区三区| 欧美久久婷婷综合色| 国产精品素人视频| 在线成人欧美| 在线亚洲伦理| 久久大逼视频| 在线视频精品| 欧美在线一区二区| 欧美国产视频在线观看| 国产精品欧美一区二区三区奶水| 国产欧美一区二区三区另类精品 | 日韩一二三区视频| 午夜精品免费在线| 亚洲精品中文字幕女同| 亚洲欧美激情四射在线日 | 欧美精品1区2区3区| 国产精品高潮呻吟久久av黑人| 国产日韩欧美制服另类| 亚洲国产精品久久人人爱蜜臀 | 99精品热视频| 亚洲第一精品夜夜躁人人躁| 一本大道av伊人久久综合| 久久岛国电影| 欧美日本一区二区三区| 国产一区二区主播在线| 日韩午夜免费视频| 亚洲国产精彩中文乱码av在线播放| 亚洲靠逼com| 久久精品国产在热久久| 欧美日韩在线视频一区二区| 国内精品模特av私拍在线观看| 亚洲精品在线视频| 久久成人这里只有精品| 亚洲欧美精品在线观看| 欧美激情精品久久久久久久变态 | 亚洲欧美激情视频在线观看一区二区三区| 久久精品国产久精国产一老狼 | 亚洲制服欧美中文字幕中文字幕| 亚洲电影免费观看高清完整版在线| 宅男在线国产精品| 欧美顶级大胆免费视频| 欧美日韩视频不卡| 国模私拍一区二区三区| 在线视频中文亚洲| 亚洲理论在线观看| 久久综合九色九九| 国产日本精品| 国产精品99久久久久久www| 亚洲精品免费看| 久久久噜噜噜久久| 国产精品中文字幕在线观看| 夜夜嗨av一区二区三区四区 | 久久狠狠婷婷| 欧美一区1区三区3区公司| 欧美日韩一区二区三区高清| 亚洲国产经典视频| 久久国内精品自在自线400部| 亚洲一区二区日本| 欧美日韩国产色站一区二区三区| 国模精品一区二区三区色天香| 中文国产成人精品久久一| 日韩视频一区二区三区在线播放免费观看 | 红桃视频欧美| 亚洲一区视频在线| 亚洲一区日韩在线| 欧美特黄视频| 亚洲剧情一区二区| 99爱精品视频| 欧美日本一区二区高清播放视频| 国产欧美一级| 午夜精品福利在线| 久久精品国产清高在天天线| 国产午夜精品久久| 欧美一区91| 久久精品一区二区| 国产亚洲欧美一区二区三区| 亚久久调教视频| 久久久久久有精品国产| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲福利视频在线| 蜜臀久久久99精品久久久久久| 国产一区二区三区四区五区美女 | 亚洲欧美精品中文字幕在线| 国产精品久久久久久超碰 | 亚洲天堂成人在线观看| 亚洲一二三级电影| 国产精品久久777777毛茸茸| 亚洲天堂av电影| 欧美一级电影久久| 国产私拍一区| 亚洲国产精品免费| 欧美国产激情| 99在线热播精品免费99热| 亚洲在线播放| 国产乱码精品一区二区三区忘忧草| 亚洲私人影院| 久久精品国产欧美激情| 在线观看成人小视频| 亚洲伦伦在线| 国产精品sm| 欧美一区二区三区四区高清 | 99爱精品视频| 午夜久久久久| 国模叶桐国产精品一区| 亚洲人体偷拍| 欧美日一区二区在线观看| 亚洲一区中文| 麻豆乱码国产一区二区三区| 最新日韩在线| 亚洲欧美日韩精品| 狠狠综合久久av一区二区老牛| 亚洲国产成人高清精品| 欧美日韩国产专区| 亚洲欧美日韩精品一区二区 | 欧美日韩国产小视频在线观看| 99视频精品全部免费在线| 午夜在线一区二区| 娇妻被交换粗又大又硬视频欧美| 亚洲日本免费| 国产精品久久久久久久久久直播 | 国产精品自在在线| 亚洲日本成人在线观看| 欧美午夜片在线免费观看| 欧美一区二区三区四区高清| 欧美激情影院| 午夜国产不卡在线观看视频| 欧美国产精品日韩| 亚洲免费综合| 欧美精品成人在线| 亚洲欧美999| 欧美成人午夜免费视在线看片| 日韩视频一区二区在线观看 | 久久久www成人免费无遮挡大片| 在线看欧美日韩| 亚洲中字在线| 亚洲高清网站| 欧美有码在线观看视频| 亚洲人成人99网站| 久久久福利视频| 在线午夜精品自拍| 欧美国产日韩一二三区| 亚洲欧美成人综合| 欧美另类一区二区三区| 欧美一区影院| 国产精品久久777777毛茸茸| 亚洲精品视频二区| 国产性天天综合网| 亚洲一区在线直播| 亚洲国产午夜| 久久久久久国产精品mv| 在线视频你懂得一区二区三区| 久久亚洲午夜电影| 亚洲在线免费视频| 欧美日韩视频一区二区| 亚洲激情影视| 国产一区二区日韩精品|