日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spi总线 上层调用_spi总线设备驱动分析

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spi总线 上层调用_spi总线设备驱动分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天折騰了一天的SPI設備的驅動加載,甚至動用了邏輯分析儀來查看spi總線的波形,主要包括兩個SPI設備,at45db321d和mcp2515,一個是串行的dataflash,一個是can總線設備芯片。前者對于我們來說非常重要,我們可以借助該設備對uboot和kernel以及根文件系統(tǒng)進行更新。

預備知識:設備和驅動是如何匹配的?系統(tǒng)的熱插拔是如何實現(xiàn)的?

首先一點,設備和驅動是嚴格區(qū)分的,設備是設備,驅動是驅動,設備通過struct device來定義,當然用戶也可以將該結構體封裝到自己定義的device結構體中,例如,struct platform_device,這是我們采用platform_bus_type總線的設備定義的結構體形式:

include/linux/platform_device.h文件中:

struct platform_device {

const char??? * name;

u32??? ??? id;

struct device??? dev;

u32??? ??? num_resources;

struct resource??? * resource;

};

只要是9260的外圍模塊,就像IIC硬件控制器,SPI硬件控制器,都被完全的定義成這種結構體的格式,這種結構體主要包含了硬件資源和名稱,硬件資源分為寄存器和IRQ兩種。platform_device通過向內(nèi)核注冊struct device dev這個結構體來告訴內(nèi)核加載這個設備,

方法就是? device_register(&platform_device->dev)

內(nèi)核不關心你使用的是platform_device還是spi_device,內(nèi)核只關心你的struct device結構體,內(nèi)核通過這個struct device結構體自然能夠順藤摸瓜找到你是platform_device還是spi_device,這就是linux最引以為傲的contian_of()大法。

驅動通過struct driver這個結構體來定義,與struct device一致,你也可以用自己的結構體去封裝:例如,struct platform_driver。

include/linux/platform_device.h文件中:

struct platform_driver {

int (*probe)(struct platform_device *);

int (*remove)(struct platform_device *);

void (*shutdown)(struct platform_device *);

int (*suspend)(struct platform_device *, pm_message_t state);

int (*suspend_late)(struct platform_device *, pm_message_t state);

int (*resume_early)(struct platform_device *);

int (*resume)(struct platform_device *);

struct device_driver driver;

};

與device一致,應用程序通過driver_register(&platform_driver->driver)向內(nèi)核中注冊你當前的驅動,而內(nèi)核不關心你封裝成的結構,而內(nèi)核搜索的方法還是同樣的contain_of大法。

系統(tǒng)如何將這兩者匹配上的?而不會將iic的設備加載到spi的驅動上面?不會將這個iic設備的驅動加載到那個iic設備上,設備和驅動之間是如何聯(lián)系的?總線,這就是總線的作用!

include/linux/device.h文件中有總線類型的定義。

struct bus_type {

const char??? ??? * name;

struct subsystem??? subsys;

struct kset??? ??? drivers;

struct kset??? ??? devices;

struct klist??? ??? klist_devices;

struct klist??? ??? klist_drivers;

struct blocking_notifier_head bus_notifier;

struct bus_attribute??? * bus_attrs;

struct device_attribute??? * dev_attrs;

struct driver_attribute??? * drv_attrs;

int??? ??? (*match)(struct device * dev, struct device_driver * drv);

int??? ??? (*uevent)(struct device *dev, char **envp,

int num_envp, char *buffer, int buffer_size);

int??? ??? (*probe)(struct device * dev);

int??? ??? (*remove)(struct device * dev);

void??? ??? (*shutdown)(struct device * dev);

int (*suspend)(struct device * dev, pm_message_t state);

int (*suspend_late)(struct device * dev, pm_message_t state);

int (*resume_early)(struct device * dev);

int (*resume)(struct device * dev);

};

這個總線設備中最重要的可能是match成員,由于我們一般很少去建立一個新的總線,所以我們很少涉及總線的編程,我們就只關注我們所關注的。

總線如何將兩者關聯(lián)起來,熱插拔大家知道吧,當一個設備被通過device_register注冊到內(nèi)核中時,會導致一個熱插拔事件產(chǎn)生,系統(tǒng)會遍歷該總線上的所有驅動程序,調(diào)用bus的match算法,來尋找與該設備相匹配的驅動程序,當一個驅動注冊到內(nèi)核的時候,處理過程與此相似(這是我理解的阿,大家批評指正),而一般的macth算法都比較簡單,例如platform_bus的匹配算法就很簡單,就是比較platform_device和platform_driver的name成員,如果匹配成功,就加載相應的設備或者驅動!這就完成了一個連接的過程。。。

那么這兩種設備驅動中最重要的類型在linux中如何表現(xiàn)出來,那我們就有必要介紹一下從2.6開始實現(xiàn)的sys文件系統(tǒng)了,

/sys/bus $ cat /etc/fstab

proc??????????? /proc?? proc??? defaults??? 0?? 0

devpts?? /dev/pts?? devpts? defaults?? 0 0

tmpfs?????????? /dev/shm???????? tmpfs? defaults??????? 0?????? 0

sysfs?????????? /sys???????????? sysfs????????? defaults??????? 0?????? 0

/dev/mtdblock2? /mnt/flash2???? yaffs?? defaults??????? 0?????? 0

加載這個文件系統(tǒng)對于我們分析設備模型是非常有好處的。

sys文件夾下一般有如下的目錄:

/sys $ ls -al

drwxr-xr-x?? 10 root???? root??????????? 0 Jan? 1? 1970 .

drwxrwxrwx?? 11 1000???? tao????????? 4096 May 22 06:56 ..

drwxr-xr-x??? 7 root???? root??????????? 0 Oct 27 14:09 block

drwxr-xr-x??? 8 root???? root??????????? 0 Jan? 1? 1970 bus

drwxr-xr-x?? 21 root???? root??????????? 0 Jan? 1? 1970 class

drwxr-xr-x??? 4 root???? root??????????? 0 Jan? 1? 1970 devices

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 firmware

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 fs

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 kernel

drwxr-xr-x?? 22 root???? root??????????? 0 Oct 27 14:10 module

block是由于歷史原因形成的block設備的文件夾。我們關心的是bus文件夾。

我們以spi設備為例:spi部分要包括兩種設備,一種是platform_device,一種是spi_device。

在arch/arm/mach-at91/at91sam9260_device.c文件中,定義的SPI硬件控制模塊設備,這我們不需要關心。

還有一種是spi_device,定義在arch/arm/mach-at91/board-sam9260ek.c文件中,這就是我們的dataflash和mcp2515設備,

所以如何設備加載成功的話,在bus下面的每個目錄里面,都存在devices和drivers兩個文件夾,分別對應設備和文件。

/sys/bus/platform/devices $ ls -al

drwxr-xr-x??? 2 root???? root??????????? 0 Oct 27 16:01 .

drwxr-xr-x??? 4 root???? root??????????? 0 Jan? 1? 1970 ..

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 at91_i2c -> ../../../devices/platform/at91_i2c

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 at91_nand -> ../../../devices/platform/at91_nand

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 at91_ohci -> ../../../devices/platform/at91_ohci

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 atmel_spi.0 -> ../../../devices/platform/atmel_spi.0

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 atmel_spi.1 -> ../../../devices/platform/atmel_spi.1

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 atmel_usart.0 -> ../../../devices/platform/atmel_usart.0

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 atmel_usart.1 -> ../../../devices/platform/atmel_usart.1

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 atmel_usart.2 -> ../../../devices/platform/atmel_usart.2

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:01 macb -> ../../../devices/platform/macb

驅動

/sys/bus/platform/drivers/atmel_spi $ ls -al

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 .

drwxr-xr-x??? 8 root???? root??????????? 0 Jan? 1? 1970 ..

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:10 atmel_spi.0 -> ../../../../devices/platform/atmel_spi.0

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 16:10 atmel_spi.1 -> ../../../../devices/platform/atmel_spi.1

--w-------??? 1 root???? root???????? 4096 Oct 27 16:10 bind

--w-------??? 1 root???? root???????? 4096 Oct 27 16:10 unbind

如果出現(xiàn)上面的這個情況,說明你的設備(兩路spi總線)和驅動都加載成功了,如果你的devices下面沒有spi.0設備和spi.1設備的話,說明

board-sam9260ek.c文件中的這個函數(shù)出錯:

static void __init ek_board_init(void)

{

/* Serial */

at91_add_device_serial();

/* USB Host */

at91_add_device_usbh(&ek_usbh_data);

/* USB Device */

at91_add_device_udc(&ek_udc_data);

/* SPI */

at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));

/* NAND */

at91_add_device_nand(&ek_nand_data);

/* Ethernet */

at91_add_device_eth(&ek_macb_data);

/* MMC */

at91_add_device_mmc(0, &ek_mmc_data);

/* I2C */

at91_add_device_i2c();

}

這里是設備注冊的地方,我們還應該在下面這個目錄下看到這兩個文件。

/sys/bus/spi/devices $ ls -al

drwxr-xr-x??? 2 root???? root??????????? 0 Oct 27 14:09 .

drwxr-xr-x??? 4 root???? root??????????? 0 Jan? 1? 1970 ..

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 14:09 spi0.1 -> ../../../devices/platform/atmel_spi.0/spi0.1

lrwxrwxrwx??? 1 root???? root??????????? 0 Oct 27 14:09 spi1.0 -> ../../../devices/platform/atmel_spi.1/spi1.0

這兩個鏈接說明我們的兩個spi設備注冊都被接受了,剩下來就是驅動的問題。有人看不懂這個sys文件系統(tǒng)的層次關系,其實這里比較好說明,就是spi0.1是atmel_spi.0設備的子設備嘛,很好理解的。

驅動:

platform_driver驅動:

/sys/bus/platform/drivers $ ls -al

drwxr-xr-x??? 8 root???? root??????????? 0 Jan? 1? 1970 .

drwxr-xr-x??? 4 root???? root??????????? 0 Jan? 1? 1970 ..

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 at91_i2c

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 at91_nand

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 at91_ohci

drwxr-xr-x??? 2 root???? root??????????? 0 Oct 27 16:10 atmel_spi

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 atmel_usart

drwxr-xr-x??? 2 root???? root??????????? 0 Jan? 1? 1970 macb

我們可以看到這個驅動只有一個atmel_spi,這個驅動是在哪加載的?

driver/spi/atmel_spi.c文件加載的。

spi_driver驅動:

/sys/bus/spi/drivers $ ls -al

drwxr-xr-x??? 4 root???? root??????????? 0 Oct 27 14:10 .

drwxr-xr-x??? 4 root???? root??????????? 0 Jan? 1? 1970 ..

drwxr-xr-x??? 2 root???? root??????????? 0 Oct 27 14:10 mcp2515

drwxr-xr-x??? 2 root???? root??????????? 0 Oct 27 14:09 mtd_dataflash

這是我們加載的兩個驅動,說明驅動也加載正常了。

下面我們來說說我們遇到的問題吧。

在設備和驅動都加載正常之后,出現(xiàn)與dataflash設備通信不上的情況,驅動加載的時候,讀取芯片的狀態(tài)字讀出是0xff,說明工作不正常,動用邏輯分析儀監(jiān)控spi總線的通信,意外的發(fā)現(xiàn),sck信號和cs信號正常,但是mosi無信號輸出,開始覺得可能是spi總線適配器有問題,后來仔細觀察原理圖之后,發(fā)現(xiàn)dataflash和mmc/sd是使用同樣的io口的,即pa0,pa1,pa2,而我的內(nèi)核配置中打開了對mmc的支持,所以導致mosi不正常,所以可能9260的mmc與dataflash不能同時使用,但9263的可以。

解決辦法:make menuconfig

Device Drivers--->MMC/SD card support,取消其支持,問題解決!

昨天其實還有一個問題可能大家沒有注意到,沒有解釋清楚,其實是有問題的,我們的at91_add_device_spi函數(shù)如下:

static struct spi_board_info ek_spi_devices[] = {

#if !defined(CONFIG_MMC_AT91)

{??? /* DataFlash chip */

.modalias??? = "mtd_dataflash",

.chip_select??? = 1,

.max_speed_hz??? = 15 * 1000 * 1000,

.bus_num??? = 0,

},

#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)

{??? /* DataFlash card */

.modalias??? = "mtd_dataflash",

.chip_select??? = 0,

.max_speed_hz??? = 15 * 1000 * 1000,

.bus_num??? = 0,

},

#endif

#endif

#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)

{??? /* AT73C213 DAC */

.modalias??? = "at73c213",

.chip_select??? = 0,

.max_speed_hz??? = 10 * 1000 * 1000,

.bus_num??? = 1,

},

#endif

/* spi can ,add by mrz */

#if defined(CONFIG_CAN_MCP2515_MODULE) ||defined(CONFIG_CAN_MCP2515)

//defined(CONFIG_CAN_MCP2515)

{

.modalias = "mcp2515",

.chip_select = 0,

//??? ??? .controller_data = AT91_PIN_PB3,

.irq = AT91_PIN_PC6, //AT91SAM9260_ID_IRQ0,

.platform_data = &mcp251x_data,

.max_speed_hz = 10 * 1000 * 1000,

.bus_num = 1,

.mode = 0,

},

/*

{

.modalias = "mcp2515",

.chip_select = 1,

//??? ??? .controller_data = AT91_PIN_PC5,

.irq = AT91_PIN_PC7, //AT91SAM9260_ID_IRQ1,

.platform_data = &mcp251x_data,

.max_speed_hz = 10 * 1000 * 1000,

.bus_num = 1,

.mode = 0,

},

*/

#elif defined(CONFIG_CAN_MCP251X)

{

.modalias = "mcp251x",

.chip_select = 0,

//??? ??? .controller_data = AT91_PIN_PB3,

.irq = AT91_PIN_PC6, //AT91SAM9260_ID_IRQ0,

.platform_data = &mcp251x_data,

.max_speed_hz = 10 * 1000 * 1000,

.bus_num = 1,

.mode = 0,

},

{

.modalias = "mcp251x",

.chip_select = 1,

//??? ??? .controller_data = AT91_PIN_PC5,

.irq = AT91_PIN_PC7, //AT91SAM9260_ID_IRQ1,

.platform_data = &mcp251x_data,

.max_speed_hz = 10 * 1000 * 1000,

.bus_num = 1,

.mode = 0,

},

#endif

}

void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)

{

int i;

unsigned long cs_pin;

short enable_spi0 = 0;

short enable_spi1 = 0;

/* Choose SPI chip-selects */

/*這里加載我們定義的spi_board_info結構體,也就是兩個spi設備的信息,注意,他們這里沒有使用spi_device結構體來做,而是使用一個板級信息體來完成。*/

for (i = 0; i < nr_devices; i++) {

/*該成員定義的就是cs引腳*/

if (devices[i].controller_data)

cs_pin = (unsigned long) devices[i].controller_data;

else if (devices[i].bus_num == 0)

cs_pin = spi0_standard_cs[devices[i].chip_select];

else

cs_pin = spi1_standard_cs[devices[i].chip_select];

/*根據(jù)需要加載的設備,確定需要打開哪幾個SPI控制器,我們系統(tǒng)中有兩個控制器,所以我們在以模塊的方式加載驅動的時候,我們的設備必須在剛開始就被初始化!*/

if (devices[i].bus_num == 0)

enable_spi0 = 1;

else

enable_spi1 = 1;

/* enable chip-select pin */

/*將片選引腳設置為輸出*/

at91_set_gpio_output(cs_pin, 1);

/* pass chip-select pin to driver */

devices[i].controller_data = (void *) cs_pin;

}

/*到此,循環(huán)執(zhí)行完畢,向內(nèi)核注冊這些板級信息體*/

spi_register_board_info(devices, nr_devices);

/* Configure SPI bus(es) */

/*如果發(fā)現(xiàn)spi0上有設備注冊,則打開spi0*/

if (enable_spi0) {

at91_set_A_periph(AT91_PIN_PA0, 0);??? /* SPI0_MISO */

at91_set_A_periph(AT91_PIN_PA1, 0);??? /* SPI0_MOSI */

at91_set_A_periph(AT91_PIN_PA2, 0);??? /* SPI1_SPCK */

at91_clock_associate("spi0_clk", &at91sam9260_spi0_device.dev, "spi_clk");

platform_device_register(&at91sam9260_spi0_device);

}

/*spi0設備也是如此*/

if (enable_spi1) {

at91_set_A_periph(AT91_PIN_PB0, 0);??? /* SPI1_MISO */

at91_set_A_periph(AT91_PIN_PB1, 0);??? /* SPI1_MOSI */

at91_set_A_periph(AT91_PIN_PB2, 0);??? /* SPI1_SPCK */

at91_clock_associate("spi1_clk", &at91sam9260_spi1_device.dev, "spi_clk");

platform_device_register(&at91sam9260_spi1_device);

}

}

從上面這個函數(shù)我們可以看出,這個函數(shù)就完成了兩個功能:

1、向內(nèi)核完成spi板級信息結構體的注冊

2、注冊了兩個platform_device:spi0與spi1,這兩個設備是spi總線控制器!

那么我們客戶端spi_device設備的注冊是如何完成的?不知道,呵呵

我今天仔細的看代碼才發(fā)現(xiàn)玄機所在。

內(nèi)核的注釋很清晰的告訴我們,我們的spi設備是不允許熱插拔!!這是由于spi設備驅動的框架不允許,我們的spi_device設備注冊不是在板級初始化的時候完成的。

在spi控制器的驅動加載的時候,也就是platform_driver:atmel_spi驅動加載的時候,

driver/spi/atmel_spi.c文件中:

static int __init atmel_spi_probe(struct platform_device *pdev)

{

struct resource??? ??? *regs;

int??? ??? ??? irq;

struct clk??? ??? *clk;

int??? ??? ??? ret;

struct spi_master??? *master;

struct atmel_spi??? *as;

regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);

if (!regs)

return -ENXIO;

irq = platform_get_irq(pdev, 0);

if (irq < 0)

return irq;

clk = clk_get(&pdev->dev, "spi_clk");

if (IS_ERR(clk))

return PTR_ERR(clk);

/* setup spi core then atmel-specific driver state */

ret = -ENOMEM;

master = spi_alloc_master(&pdev->dev, sizeof *as);

if (!master)

goto out_free;

master->bus_num = pdev->id;

master->num_chipselect = 4;

master->setup = atmel_spi_setup;

master->transfer = atmel_spi_transfer;

master->cleanup = atmel_spi_cleanup;

platform_set_drvdata(pdev, master);

as = spi_master_get_devdata(master);

as->buffer = dma_alloc_coherent(&pdev->dev, BUFFER_SIZE,

&as->buffer_dma, GFP_KERNEL);

if (!as->buffer)

goto out_free;

spin_lock_init(&as->lock);

INIT_LIST_HEAD(&as->queue);

as->pdev = pdev;

as->regs = ioremap(regs->start, (regs->end - regs->start) + 1);

if (!as->regs)

goto out_free_buffer;

as->irq = irq;

as->clk = clk;

#ifdef CONFIG_ARCH_AT91

if (!cpu_is_at91rm9200())

as->new_1 = 1;

#endif

ret = request_irq(irq, atmel_spi_interrupt, 0,

pdev->dev.bus_id, master);

if (ret)

goto out_unmap_regs;

/* Initialize the hardware */

clk_enable(clk);

spi_writel(as, CR, SPI_BIT(SWRST));

spi_writel(as, MR, SPI_BIT(MSTR) | SPI_BIT(MODFDIS));

spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS));

spi_writel(as, CR, SPI_BIT(SPIEN));

/* go! */

dev_info(&pdev->dev, "Atmel SPI Controller at 0x%08lx (irq %d)\n",

(unsigned long)regs->start, irq);

/*spi注冊這個主控制器*/

ret = spi_register_master(master);

if (ret)

goto out_reset_hw;

return 0;

out_reset_hw:

spi_writel(as, CR, SPI_BIT(SWRST));

clk_disable(clk);

free_irq(irq, master);

out_unmap_regs:

iounmap(as->regs);

out_free_buffer:

dma_free_coherent(&pdev->dev, BUFFER_SIZE, as->buffer,

as->buffer_dma);

out_free:

clk_put(clk);

spi_master_put(master);

return ret;

}

而這個spi_register_master位于driver/spi/spi.c文件中,該函數(shù)調(diào)用了scan_boardinfo(master),掃描該spi master下面設備。該函數(shù)就存在于該文件下:該函數(shù)調(diào)用了spi_new_device(master, chip),這個chip就是一個spi_board_info結構體,這就是at91_add_device_spi第一個作用的用處:向內(nèi)核的鏈表注冊spi_board_info結構體的用處所在。我們來看函數(shù)的調(diào)用過程:

atmel_spi_probe----->spi_register_master----->scan_boardinfo

---->spi_new_device我們來看這個spi_new_device函數(shù):

struct spi_device *spi_new_device(struct spi_master *master,

struct spi_board_info *chip)

{

struct spi_device??? *proxy;

struct device??? ??? *dev = master->cdev.dev;

int??? ??? ??? status;

/* NOTE:? caller did any chip->bus_num checks necessary */

if (!spi_master_get(master))

return NULL;

/*靠,終于找到你了,先暴打一頓,舒服了。。這里就分配了我們重要的spi_device結構體*/

proxy = kzalloc(sizeof *proxy, GFP_KERNEL);

if (!proxy) {

dev_err(dev, "can't alloc dev for cs%d\n",

chip->chip_select);

goto fail;

}

/*這就是將我們的信息體中的數(shù)據(jù)轉化為spi_device識別的數(shù)據(jù)*/

proxy->master = master;

proxy->chip_select = chip->chip_select;

proxy->max_speed_hz = chip->max_speed_hz;

proxy->mode = chip->mode;

proxy->irq = chip->irq;

proxy->modalias = chip->modalias;

snprintf(proxy->dev.bus_id, sizeof proxy->dev.bus_id,

"%s.%u", master->cdev.class_id,

chip->chip_select);

proxy->dev.parent = dev;

proxy->dev.bus = &spi_bus_type;

/*這里很重要,如果你的spi設備是dataflash的話,保存的就是你的分區(qū)表!!!所以我們要返回去修改我們的spi_boardinfo結構體*/

proxy->dev.platform_data = (void *) chip->platform_data;

/*片選信號*/

proxy->controller_data = chip->controller_data;

proxy->controller_state = NULL;

proxy->dev.release = spidev_release;

/* drivers may modify this default i/o setup */

status = master->setup(proxy);

if (status < 0) {

dev_dbg(dev, "can't %s %s, status %d\n",

"setup", proxy->dev.bus_id, status);

goto fail;

}

/* driver core catches callers that misbehave by defining

* devices that already exist.

*/

/*看到這句話,大家放心了吧,大家也就知道怎么找到spi_driver驅動的。。。*/

status = device_register(&proxy->dev);

if (status < 0) {

dev_dbg(dev, "can't %s %s, status %d\n",

"add", proxy->dev.bus_id, status);

goto fail;

}

dev_dbg(dev, "registered child %s\n", proxy->dev.bus_id);

return proxy;

fail:

spi_master_put(master);

kfree(proxy);

return NULL;

}

下面我們要解決最后的一個問題,dataflash的分區(qū)的問題,看了這么多,大家應該知道怎么解決了吧!

我們看mtd_dataflash.c文件中驅動加載函數(shù)調(diào)用了下面這個函數(shù)來添加flash設備。。

static int __devinit

add_dataflash(struct spi_device *spi, char *name,

int nr_pages, int pagesize, int pageoffset)

{

struct dataflash??? ??? *priv;

struct mtd_info??? ??? ??? *device;

/*這里就告訴我們要在spi_boardinfo結構體的platform_data成員指向一個我們需要的flash_platform_data數(shù)據(jù)!*/

struct flash_platform_data??? *pdata = spi->dev.platform_data;

priv = kzalloc(sizeof *priv, GFP_KERNEL);

if (!priv)

return -ENOMEM;

init_MUTEX(&priv->lock);

priv->spi = spi;

priv->page_size = pagesize;

priv->page_offset = pageoffset;

/* name must be usable with cmdlinepart */

sprintf(priv->name, "spi%d.%d-%s",

spi->master->bus_num, spi->chip_select,

name);

device = &priv->mtd;

device->name = (pdata && pdata->name) ? pdata->name : priv->name;

device->size = nr_pages * pagesize;

device->erasesize = pagesize;

device->writesize = pagesize;

device->owner = THIS_MODULE;

device->type = MTD_DATAFLASH;

device->flags = MTD_WRITEABLE;

device->erase = dataflash_erase;

device->read = dataflash_read;

device->write = dataflash_write;

device->priv = priv;

dev_info(&spi->dev, "%s (%d KBytes)\n", name, device->size/1024);

dev_set_drvdata(&spi->dev, priv);

if (mtd_has_partitions()) {

struct mtd_partition??? *parts;

int??? ??? ??? nr_parts = 0;

/*我們這里沒有定義該宏,所以不會在命令行傳遞分區(qū)表*/

#ifdef CONFIG_MTD_CMDLINE_PARTS

static const char *part_probes[] = { "cmdlinepart", NULL, };

nr_parts = parse_mtd_partitions(device, part_probes, &parts, 0);

#endif

if (nr_parts <= 0 && pdata && pdata->parts) {

parts = pdata->parts;

nr_parts = pdata->nr_parts;

}

if (nr_parts > 0) {

priv->partitioned = 1;

return add_mtd_partitions(device, parts, nr_parts);

}

} else if (pdata && pdata->nr_parts)

dev_warn(&spi->dev, "ignoring %d default partitions on %s\n",

pdata->nr_parts, device->name);

return add_mtd_device(device) == 1 ? -ENODEV : 0;

}

所以我們需要修改這個文件:

arch/arm/mach-at91/board-sam9260ek.c文件:

添加如下:

#if? !defined(CONFIG_MMC_AT91)

#define??? SIZE_1PAGE??? 528

#define??? SIZE_1M (unsigned long)(1024*1024)

static struct mtd_partition ek_dataflash_partition[] = {

{

.name??? = "U-boot ENV",

.offset??? = 0,

.size??? = 64*SIZE_1PAGE,

},

{

.name??? = "U-BOOT",

.offset??? = 64*SIZE_1PAGE,

.size??? = 400*SIZE_1PAGE,

},

{

.name ="Kernel",

.offset=464*SIZE_1PAGE,

.size??? = 4000*SIZE_1PAGE,

},

{

.name ="Root fs",

.offset=4464*SIZE_1PAGE,

.size??? = (8192-4464)*SIZE_1PAGE,

},

};

struct flash_platform_data dataflash_atmel={

.name="AT45DB321",

.parts=ek_dataflash_partition,

.nr_parts=ARRAY_SIZE(ek_dataflash_partition),

};

#endif

修改spi_boardinfo結構體:

static struct spi_board_info ek_spi_devices[] = {

#if !defined(CONFIG_MMC_AT91)

{??? /* DataFlash chip */

.modalias??? = "mtd_dataflash",

.chip_select??? = 1,

.max_speed_hz??? = 15 * 1000 * 1000,

.bus_num??? = 0,

.platform_data=&dataflash_atmel,

},

添加platform_data結構成員。

這里我們建立mtd_partition結構體要注意,由于dataflash是以528字節(jié)每頁的,其實,at45db321x芯片可以設置為512字節(jié)每頁,這個操作是不可以逆轉的,那個位是一個otp位,用過的人就應該知道,但是出廠的時候默認的528字節(jié)每頁。

如果我們不是以528個字節(jié)為單位的話,內(nèi)核將出警告,強制將分區(qū)加載為readonly格式。

到此,分區(qū)加載成功,dmesg輸出如下信息:

<6>mtd_dataflash spi0.1: AT45DB321x (4224 KBytes)

<5>Creating 4 MTD partitions on "AT45DB321":

<5>0x00000000-0x00008400 : "U-boot ENV"

<5>0x00008400-0x0003bd00 : "U-BOOT"

<5>0x0003bd00-0x0023f700 : "Kernel"

<5>0x0023f700-0x00420000 : "Root fs"

linux簡直太偉大了,使用得越多,就越能體會到其思想的偉大!靈活!

總結

以上是生活随笔為你收集整理的spi总线 上层调用_spi总线设备驱动分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

日韩视频中文字幕在线观看 | 91九色蝌蚪视频网站 | 人人射网站 | 丁香五月缴情综合网 | 亚洲最大av网 | 日本久久电影网 | 国产91在线播放 | 日本成人a | 婷婷亚洲五月色综合 | 国产精品美乳一区二区免费 | 91精品电影 | 视频三区 | 日本中文字幕网址 | 亚洲国产综合在线 | 国产精品久久久999 国产91九色视频 | av丝袜美腿 | 精品国产大片 | 婷婷色社区 | 少妇自拍av | 最近中文字幕完整视频高清1 | 国产成人一区二区三区免费看 | 成人国产精品久久久春色 | 在线观看日韩专区 | 午夜久久影院 | 日韩黄色一区 | 国产高清永久免费 | www.成人sex| 亚洲成年人av| 97视频网站 | 亚洲 欧美 变态 国产 另类 | 日本系列中文字幕 | 亚洲午夜不卡 | 久久免费精品国产 | 91精品人成在线观看 | 美女视频久久黄 | 国产精品一区二区久久 | 午夜精品一区二区三区在线 | 日日夜夜天天久久 | 久久成人18免费网站 | 国产精品 日韩精品 | 国产成人一区二区精品非洲 | 国产亚洲婷婷免费 | 日韩午夜小视频 | 91九色蝌蚪国产 | 欧美精品一二 | 综合精品在线 | 91你懂的| 奇米先锋 | 黄av资源| 一级a毛片高清视频 | a黄色 | www.色国产 | 麻豆观看| 99免费在线播放99久久免费 | 国产成人av在线 | 日日操夜夜操狠狠操 | 日韩av片无码一区二区不卡电影 | 黄色在线观看网站 | 免费看黄电影 | 久插视频 | 婷婷四房综合激情五月 | 九九久久精品视频 | 99国产精品久久久久老师 | 国产精品久久久久久久婷婷 | 国内精品久久久久久久久 | 久久精品国产v日韩v亚洲 | 色婷婷骚婷婷 | av免费在线免费观看 | 亚洲成人av片 | 在线视频免费观看 | 四虎影视4hu4虎成人 | 久久99国产精品二区护士 | 中文字幕日本特黄aa毛片 | 亚洲精品网页 | 亚洲热久久 | 奇米影视8888| 超碰97人人在线 | 91亚洲狠狠婷婷综合久久久 | 香蕉网站在线观看 | 国产无吗一区二区三区在线欢 | 99免费在线视频观看 | 韩日精品在线 | 婷婷激情综合 | 欧美日韩高清不卡 | 欧美日韩在线观看一区 | 国产成人久久精品 | 日韩精品视频久久 | 亚洲一区二区视频 | 操操操夜夜操 | www视频在线播放 | av线上免费看 | 在线看小早川怜子av | 亚洲一区二区91 | 4438全国亚洲精品在线观看视频 | av解说在线观看 | 国产黄色片在线免费观看 | 免费的成人av | 欧美电影黄色 | 狠狠色噜噜狠狠狠合久 | 久久久久久久av | 一本色道久久精品 | 欧美精品被| 草久中文字幕 | 国产精品一区二区av日韩在线 | 久久午夜精品 | 五月天久久久 | 国产伦精品一区二区三区免费 | 一区二区影院 | 国产精品黄色 | 日韩成人中文字幕 | 国产精品一级在线 | 国产成人精品一区二区三区 | 国产一区播放 | 亚洲国产精品日韩 | 97av视频在线观看 | 国产成人精品一区二区三区福利 | 天天操天天干天天爽 | 国产精品成人a免费观看 | 激情久久一区二区三区 | 日韩大片在线播放 | 日日夜夜婷婷 | www.人人干 | 国产精品嫩草影院99网站 | 欧美精品中文在线免费观看 | 一区二区三区在线观看 | 在线日韩亚洲 | 日本99热| 国产资源中文字幕 | 久久欧美在线电影 | 久久久久欠精品国产毛片国产毛生 | 天天躁天天躁天天躁婷 | 天天操人人要 | 日本精品一二区 | 99久热在线精品视频成人一区 | 一区二区 不卡 | 久久精品中文字幕一区二区三区 | 特级大胆西西4444www | 国产成人黄色 | 亚洲精品乱码久久久一二三 | 亚洲精品自拍 | 在线视频1卡二卡三卡 | 亚洲国产中文字幕 | 日韩国产欧美在线视频 | 激情视频区 | 性色va | 久久中国精品 | 亚洲人成人天堂h久久 | 在线视频18在线视频4k | 亚洲第一色 | 久久久久亚洲精品 | 国产成人亚洲在线观看 | 中文字幕国内精品 | 免费看国产视频 | 国产黄色电影 | 国产国产人免费人成免费视频 | 久久久www成人免费精品 | 久草在线视频网 | 国产精品入口传媒 | 天堂av在线免费 | 精品xxx| 久久久国产一区二区 | 91mv.cool在线观看 | 欧美精品v国产精品v日韩精品 | 在线观看成人国产 | 插插插色综合 | 狠狠干狠狠久久 | 国产一级视频在线观看 | 国产无遮挡又黄又爽在线观看 | 国产免费视频一区二区裸体 | 成 人 黄 色 视频免费播放 | 成人性生交视频 | 中文字幕在线看视频国产 | www.国产在线观看 | 国产在线观看一区 | 国产精品久久久久av免费 | 在线观看片 | 久久中文字幕在线视频 | 精品主播网红福利资源观看 | 国产成人在线观看 | 国产精品女同一区二区三区久久夜 | 69av免费视频 | 久久久国产精品电影 | 日韩免费在线观看网站 | 欧美va日韩va | a√天堂中文在线 | 日韩在线视频网 | 亚洲爱视频 | 激情五月亚洲 | 国产精品视频99 | 中国一级特黄毛片大片久久 | 亚洲另类视频在线 | 国产精品一区二区三区在线免费观看 | 视频在线一区二区三区 | 五月综合久久 | 精品在线一区二区三区 | 一区二区 精品 | 一区二区三区在线看 | 日韩电影在线观看一区 | 精品国产一区二区三区噜噜噜 | 久久6精品 | 欧美一区免费在线观看 | 亚洲欧美国内爽妇网 | 一区二区三区四区五区在线视频 | 四虎国产精品免费 | 久久久免费观看视频 | 在线观看国产中文字幕 | 国产精品久久99综合免费观看尤物 | 精品96久久久久久中文字幕无 | av中文字幕在线看 | 2022中文字幕在线观看 | 999久久久久久久久6666 | 婷婷激情小说网 | 特级西西444www大精品视频免费看 | 97日日碰人人模人人澡分享吧 | 亚洲视频免费在线看 | 久久久久欧美精品999 | 久久久久在线 | 亚洲毛片一区二区三区 | 国产69精品久久99的直播节目 | 手机在线观看国产精品 | 国产一卡二卡四卡国 | 91豆麻精品91久久久久久 | 在线观看日韩精品 | 欧美日韩中文在线观看 | 黄色一级大片免费看 | 欧美视频xxx | 国产淫片 | 久久久国产成人 | 日韩欧美在线视频一区二区三区 | 亚洲婷婷网 | 色诱亚洲精品久久久久久 | 精品国产一区二区三区四区vr | 香蕉一区| 精品在线观看免费 | 国产亚洲视频在线观看 | 欧美精选一区二区三区 | 中文在线www | 91系列在线 | 精品国产乱码一区二区三区在线 | 色激情在线 | 国产手机在线播放 | 国产一区福利 | 国产在线黄| 国产男女爽爽爽免费视频 | 久久久久国产精品免费免费搜索 | 成人羞羞免费 | 岛国一区在线 | 亚洲一区动漫 | 欧美日韩高清国产 | 国产精品99久久久久久久久久久久 | 国产综合精品久久 | 91亚洲精品国产 | 亚洲精品tv| 最近中文字幕在线中文高清版 | 久久 国产一区 | 久色小说 | 色爱区综合激月婷婷 | 日韩高清不卡一区二区三区 | 亚洲精品麻豆视频 | 91传媒在线 | 又黄又刺激视频 | 97福利视频 | av成人在线播放 | 成人a级网站 | 日韩av在线高清 | 久久久久电影网站 | 中文av网站| 啪啪肉肉污av国网站 | 成年人电影毛片 | 日韩在线资源 | 福利网在线 | 成人黄色片在线播放 | 国产一级片一区二区三区 | 欧美一区二区三区在线播放 | 免费高清在线一区 | 精品国产乱码久久久久久三级人 | 免费美女久久99 | 中文乱幕日产无线码1区 | 国产只有精品 | 国产无遮挡猛进猛出免费软件 | 豆豆色资源网xfplay | 婷婷激情综合五月天 | 97视频资源 | 中文在线免费一区三区 | 欧美日韩久久不卡 | 一区二区视频网站 | 国产99久久精品一区二区300 | 久久综合久久综合久久综合 | 波多野结衣动态图 | www黄在线 | 国产精品激情偷乱一区二区∴ | 亚洲国产精品传媒在线观看 | 三级黄色在线 | 色狠狠婷婷| 99高清视频有精品视频 | 欧美伦理一区 | 久久综合九色综合欧美就去吻 | 人人揉人人揉人人揉人人揉97 | 久久在视频| 精品久久毛片 | 日韩免费b | 日韩亚洲在线观看 | 在线观看一区二区精品 | 国内精品久久久久久 | 国产精品美女久久久久久2018 | 中国美女一级看片 | av观看在线观看 | 亚洲日本va午夜在线电影 | 国产精品99久久久久的智能播放 | 在线观看黄色的网站 | 久久久精品久久日韩一区综合 | 天天操天天操天天操天天操天天操 | 国产91av视频在线观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 91大片网站 | 丁香婷婷久久 | 黄色视屏在线免费观看 | 亚洲精品免费在线观看 | 蜜桃av久久久亚洲精品 | 在线观看精品黄av片免费 | 色射色| 亚洲电影黄色 | 在线观看国产中文字幕 | 五月视频 | 草莓视频在线观看免费观看 | 日韩免费久久 | 久久人人精 | 五月婷婷综合激情 | 日日夜夜天天射 | 日韩欧美在线一区二区 | 九九色综合 | 国产精品免费在线视频 | 国产精品久久久久久久久免费 | 久久久午夜电影 | av片中文字幕 | 国产大片免费久久 | 亚洲五月 | 日韩二区在线播放 | 中文字幕一区二区三区在线观看 | 亚洲成a人片在线www | 午夜精品久久久久 | 欧美成人免费在线 | 青青视频一区 | 视频在线观看入口黄最新永久免费国产 | 久久久久久久久久久网站 | 欧美精品一区二区蜜臀亚洲 | 国产在线观看地址 | 97在线免费视频 | 欧美激情精品一区 | 免费av在线网站 | 国产精品 中文字幕 亚洲 欧美 | 日日日日日 | 丁香电影小说免费视频观看 | 高清中文字幕av | 国产精品久久久久久久久久久久 | 久久黄色网址 | 婷婷丁香五 | 国产伦精品一区二区三区在线 | 91 在线视频播放 | 久久免费视频8 | 国产精品嫩草在线 | 久久黄色网 | 国产日韩欧美在线影视 | 婷婷亚洲五月色综合 | 国产18精品乱码免费看 | 久久免费公开视频 | 五月天亚洲婷婷 | 四虎影视国产精品免费久久 | 久久精品国产99 | 国产精品国内免费一区二区三区 | 中文字幕麻豆 | 日本精品久久久久影院 | 久久手机看片 | 国产一区二区三区在线免费观看 | 91中文字幕在线播放 | 亚洲春色综合另类校园电影 | 国产精品午夜免费福利视频 | 欧美激情第八页 | 久久精品国亚洲 | 91手机电影 | 91麻豆文化传媒在线观看 | 国产福利精品在线观看 | 日韩av在线一区二区 | 91爱爱免费观看 | 在线免费视频a | 中文字幕在线视频一区二区 | 久久艹免费 | 97免费公开视频 | 人人澡人人添人人爽一区二区 | 久9在线 | 日韩中文在线电影 | 欧美日韩在线观看一区二区 | av不卡网站 | 国产一区二区在线视频观看 | 中文国产在线观看 | 中国一级片免费看 | 香蕉网在线 | 又黄又爽又无遮挡的视频 | 色视频网址 | 国产亚洲视频中文字幕视频 | 在线视频一二三 | 久久精品国产v日韩v亚洲 | 午夜久久福利视频 | 精品视频资源站 | 国产精品网红直播 | 久久久久国产精品一区二区 | 国产丝袜美腿在线 | 国产一线在线 | av软件在线观看 | 亚洲激情精品 | 久久玖| 精品伊人久久久 | 日韩视频一区二区在线 | 成人三级网站在线观看 | 国产美女搞久久 | 国产资源网 | 天天舔天天搞 | 在线观看亚洲精品 | 狠狠干综合网 | 九九热免费在线观看 | 97人人模人人爽人人喊网 | 国产91综合一区在线观看 | 成人作爱视频 | 亚洲免费一级 | 色老板在线 | 西西444www高清大胆 | 国产精品高清在线观看 | 99久久精品一区二区成人 | 中国成人一区 | 欧美成年网站 | 欧美色精品天天在线观看视频 | 日韩av男人的天堂 | 国产丝袜美腿在线 | 国产品久精国精产拍 | 欧美日韩在线看 | 一区二区三区在线免费观看视频 | 97在线影视 | 国产精品成人a免费观看 | 亚洲精品成人av在线 | 99精品欧美一区二区 | 国际精品久久久久 | 综合在线色 | 久久久国产精品亚洲一区 | 免费网站观看www在线观看 | 一级一片免费观看 | 日韩av影视在线观看 | 正在播放五月婷婷狠狠干 | 波多野结衣视频一区二区三区 | 国产色综合 | 久久精品99久久久久久2456 | 精品国产aⅴ一区二区三区 在线直播av | 国产精品中文久久久久久久 | 亚洲丝袜中文 | 2019天天干天天色 | 久久久久欠精品国产毛片国产毛生 | 毛片区 | 亚洲精品一区二区精华 | 国内精品久久久久久久影视麻豆 | 天天射,天天干 | 国产69精品久久久久9999apgf | 最近久乱中文字幕 | 二区三区精品 | av在线等 | 97色在线观看免费视频 | 九九热免费在线视频 | 一区久久久 | 国产精品久久久久永久免费看 | 国产中文字幕一区二区 | 色婷婷啪啪免费在线电影观看 | 最近中文字幕免费大全 | 中文字幕在线观看你懂的 | 国产免费资源 | 六月婷婷久香在线视频 | 久久99精品一区二区三区三区 | 亚洲国产99| 婷婷丁香导航 | 中文字幕韩在线第一页 | 最近高清中文字幕 | 欧美日韩在线观看一区 | 国产高清精品在线 | 精品国产一区二区三区av性色 | 99久久精品国产免费看不卡 | av网址在线播放 | 亚洲国产日韩一区 | 亚洲闷骚少妇在线观看网站 | 韩日av一区二区 | 亚洲成人av在线电影 | 免费观看黄 | 久草在线综合 | 日韩亚洲国产精品 | 久免费| 亚洲少妇自拍 | 欧美成人性战久久 | 亚洲精品国久久99热 | 91成人区| 精品国产1区2区 | 国产片网站| av免费播放 | 五月婷婷综合久久 | 97操操| 狠狠网亚洲精品 | 伊人五月天综合 | 亚洲资源在线观看 | 亚洲一二三区精品 | 久久亚洲区 | 欧美色图狠狠干 | 久久综合在线 | 欧美精品久久 | 国产黄色片网站 | 福利区在线观看 | 夜色在线资源 | 97香蕉久久超级碰碰高清版 | 国产精品女同一区二区三区久久夜 | 91色网址 | 日本婷婷色 | 成人看片 | 亚洲日本中文字幕在线观看 | 久久99这里只有精品 | 99久久精品国产网站 | 99热在线国产 | 69绿帽绿奴3pvideos | 波多野结依在线观看 | 992tv在线观看 | 国产黄色精品在线 | 亚洲干视频在线观看 | 91传媒免费观看 | 亚州精品天堂中文字幕 | 日本性视频 | 天天射天天爱天天干 | 日韩免费视频线观看 | 特级毛片网 | 丝袜美腿在线视频 | 黄色av电影| 免费国产在线精品 | 波多野结衣视频一区二区三区 | 日韩网站一区 | 日产乱码一二三区别免费 | 东方av在 | 99久久精品电影 | 激情五月婷婷综合网 | 成人午夜电影网站 | 国产精品久久久久久久久久三级 | 国产精品日韩欧美一区二区 | 国产精品嫩草影院99网站 | av电影免费在线看 | 国产第一页在线播放 | 国产亲近乱来精品 | 久久久精品欧美一区二区免费 | 丁香5月婷婷久久 | 久久精品国产成人精品 | 黄色免费网 | 欧美日韩国产在线观看 | 韩国av电影在线观看 | 九九九热精品 | 国产中文在线播放 | 在线免费中文字幕 | 91理论片午午伦夜理片久久 | 日韩免费在线看 | 久久免费黄色大片 | 色婷婷激情五月 | 成年人视频在线免费 | 久久久久福利视频 | 这里只有精彩视频 | 免费毛片一区二区三区久久久 | 国产在线一区观看 | 91热| 激情综合中文娱乐网 | 欧美乱熟臀69xxxxxx | 国产高清av免费在线观看 | 亚洲在线高清 | 在线观看av免费 | 黄色毛片视频免费观看中文 | 中文av在线播放 | 7777精品伊人久久久大香线蕉 | 97av影院| 可以免费看av | 日韩在线视频网 | 91精品少妇偷拍99 | 999精品 | 开心激情五月婷婷 | 99免费在线观看 | 亚洲综合色激情五月 | 免费观看国产视频 | 欧美日韩18 | a在线一区 | 综合天天色 | 国产特级毛片aaaaaa毛片 | 中文字幕av在线免费 | 正在播放国产一区二区 | 亚洲激情av | 九九影视理伦片 | www.色国产 | 国产精品久久久久久久久久久免费 | 激情视频一区二区三区 | 久久九九久久 | 久久久国产精品成人免费 | 久久久久久综合网天天 | 激情视频久久 | 欧美福利久久 | 中文字幕日本在线 | 日本性xxx| 97超碰人人澡人人爱 | 欧美视频18 | 在线有码中文 | 黄色网中文字幕 | 天天干.com | 99婷婷狠狠成为人免费视频 | 免费美女久久99 | 特级西西444www大精品视频免费看 | 少妇做爰k8经典 | 国产精品久久久久久久久毛片 | 国产精品精品国产色婷婷 | 久久草在线精品 | 国产午夜在线观看 | 337p日本欧洲亚洲大胆裸体艺术 | 国产在线色视频 | 日韩高清国产精品 | 成年人免费在线播放 | 欧美精品xxx| av资源免费在线观看 | 亚洲永久精品视频 | 精品久久久久一区二区国产 | 欧美做受高潮 | 国产99久久精品一区二区永久免费 | 国产一区二区不卡视频 | 欧美一级日韩三级 | 亚洲一区二区视频在线播放 | 96久久久 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 久久99精品久久久久婷婷 | 欧美日韩视频在线 | 天天摸天天操天天爽 | 日韩欧美一区二区三区视频 | 成人一区二区三区在线观看 | 夜色资源网| av免费福利 | 草久久久久久久 | 99视频精品免费视频 | 99久久精品国产亚洲 | 国产精品久久久久久久午夜 | 色婷婷88av视频一二三区 | 国产69精品久久久久99 | 99久久久久久久久 | 免费a v观看 | 男女拍拍免费视频 | 韩国一区二区三区视频 | www.神马久久 | 国产99久久久国产精品成人免费 | 91看片淫黄大片在线播放 | 亚洲视频精品 | japanese黑人亚洲人4k | 国产主播大尺度精品福利免费 | 国产中文字幕在线免费观看 | 亚洲视频 一区 | 99 精品 在线 | av软件在线观看 | 91亚色视频| 免费在线观看日韩 | 久热色超碰 | 深夜免费小视频 | 在线电影播放 | 欧美成人理伦片 | 人人爽人人插 | 国内99视频| 日韩在线视频播放 | 日日日网| 啪嗒啪嗒免费观看完整版 | 看国产黄色片 | 久久久久伦理电影 | 美女黄频 | 亚洲黄色av网址 | 欧美日韩视频在线一区 | 五月婷婷欧美视频 | 韩日精品中文字幕 | 国产精品久久久av | 久久短视频 | av色一区 | 亚洲妇女av | 中文字幕亚洲五码 | 五月激情五月激情 | 制服丝袜欧美 | 久久精品免费观看 | 久久国产精品免费看 | 亚洲精品成人免费 | 久久人人97超碰精品888 | 欧美日韩国产精品一区二区三区 | 久久免费视频网 | 久久视频二区 | 国产精在线 | 国产精品久久久久999 | 国产精品一区二区久久久久 | 亚洲精品自拍视频在线观看 | 久久五月婷婷丁香社区 | 国产精品美女999 | 在线观看一区二区精品 | 最近中文字幕免费 | 成人毛片久久 | 久久精品99久久 | 中文字幕日韩有码 | 美女国产网站 | 在线国产99 | 天天看天天干天天操 | 激情图片久久 | 久久久精品免费看 | 96精品视频| 久久久久福利视频 | 一区二区三区在线电影 | 久久视频二区 | 国产精品永久久久久久久www | 国产精品欧美久久久久久 | 国产精品毛片久久 | 激情五月播播久久久精品 | 伊人婷婷在线 | 日韩免费中文 | 亚洲精品国产精品99久久 | 色综合久久中文综合久久牛 | 日本在线观看中文字幕无线观看 | 亚洲精品视频在线免费播放 | 青草视频在线看 | 日韩免费在线观看网站 | 日韩视频欧美视频 | 四虎影视成人精品国库在线观看 | 亚洲一级免费观看 | 免费欧美 | 探花视频免费观看高清视频 | av电影中文字幕在线观看 | 国产高清在线看 | 国内精品小视频 | 欧美亚洲免费在线一区 | 日韩免费观看一区二区 | 中文字幕一区二区三区在线视频 | 精品视频国产一区 | 久久特级毛片 | 中文字幕日本电影 | 国产在线1区 | 精品视频资源站 | 久久精品国产亚洲精品 | 韩国av三级| 国产精品一区二区精品视频免费看 | 91精品久久久久久综合五月天 | 91在线免费观看网站 | 欧美成人黄色 | 色操插 | 一区二区三区在线观看 | 日韩毛片在线一区二区毛片 | 国产日韩欧美视频 | 久久精品毛片基地 | 久久国产欧美日韩精品 | 日韩欧美高清 | 九九热在线视频免费观看 | 国产亚洲精品久久久久久网站 | 国产亚洲一区二区三区 | 狠狠色丁香久久综合网 | 91视频久久久| 99精品福利 | 国产高清网站 | 久久激情视频 久久 | 久久精品国产成人 | 久久国产精品一区二区三区四区 | 一本一本久久a久久精品综合 | 国产亚洲永久域名 | 国产裸体视频网站 | 久久婷婷激情 | 在线国产能看的 | 国产精品日韩久久久久 | 在线av资源 | 久久涩涩网站 | 91视频 - v11av| 久久精品综合网 | 99精品国产视频 | 午夜精品av | av片在线观看 | 在线91精品 | 欧美人交a欧美精品 | 国产精品99精品 | 开心激情久久 | 久久精品九色 | 久草在线免费资源站 | 日本少妇视频 | 97国产精品亚洲精品 | 日韩视频一二三区 | 国产.精品.日韩.另类.中文.在线.播放 | 亚洲精品网页 | 久久黄色片子 | 久久a v视频 | 国产高清在线观看av | 亚洲一区精品人人爽人人躁 | 中文在线中文a | 97超碰在线免费 | 偷拍区另类综合在线 | 中文字幕免费 | 日韩欧美高清不卡 | 国产精品久久久久永久免费观看 | 国产a级免费 | 日韩av免费观看网站 | 久久视频网 | 久久久久久久久久影视 | 天堂中文在线视频 | 久久国产香蕉视频 | 99精品毛片| 日日天天干 | 日本黄色免费播放 | 99精品视频网站 | 99热手机在线观看 | 中字幕视频在线永久在线观看免费 | 欧美精品免费视频 | 在线成人免费电影 | 国产专区在线播放 | 日韩毛片在线一区二区毛片 | 久久精品一区二区三区中文字幕 | 91在线免费播放视频 | 色天堂在线视频 | 欧美激情亚洲综合 | 黄色av网站在线免费观看 | 欧美日韩一区二区免费在线观看 | 精品久久久久一区二区国产 | 国内精品久久久久久久久久久久 | 午夜精品一区二区三区视频免费看 | 免费观看一级 | 午夜精品一区二区三区可下载 | 中文字幕久久久精品 | 开心激情久久 | 日日干精品 | 国产成在线观看免费视频 | 992tv在线观看 | 国产最新视频在线观看 | 中文字幕一区二区三区四区久久 | www.婷婷com| 最新亚洲视频 | 欧美一区二区伦理片 | 亚洲国产色一区 | 欧美va在线观看 | 国内精品美女在线观看 | 欧美精品久久久久久 | 91精品视频免费看 | 日日夜夜免费精品 | 91黄色影视 | 国产又粗又猛又色 | 精品久久国产精品 | 水蜜桃亚洲一二三四在线 | 香蕉久久久久久av成人 | 色婷婷99| 中文字幕乱在线伦视频中文字幕乱码在线 | 在线免费视频一区 | 中文国产在线观看 | 在线免费视 | 91精品国产麻豆 | 亚洲精品视频免费 | www黄色大片 | 亚洲精品66| 国产99久久久国产精品成人免费 | 激情久久五月 | 亚洲九九爱 | 亚洲欧美视频一区二区三区 | 日韩欧美一区二区三区视频 | 六月丁香激情综合 | 最新国产精品拍自在线播放 | 欧美日韩超碰 | 欧美激情xxxx性bbbb | 香蕉蜜桃视频 | 草久久影院 | 超碰人人超 | 精品一区二区三区在线播放 | 欧美精品久久久久久久亚洲调教 | 黄色福利网站 | 亚洲一区免费在线 | 天天操天天操天天操天天操天天操天天操 | 亚洲永久国产精品 | 91精品第一页 | 久久久九九 | 精品在线观看免费 | 黄色日批网站 | 久久久久综合网 | 精品国产伦一区二区三区观看方式 | 91少妇精拍在线播放 | 亚洲视频456 | 中文字幕成人在线观看 | 91视频首页| 狠狠撸电影 | 亚洲福利精品 | 久久久久久综合 | 色视频网站在线观看一=区 a视频免费在线观看 | 黄色一级性片 | 色大片免费看 | 日韩免费网址 | 在线观看免费中文字幕 | 九九九热精品免费视频观看网站 | 欧美日韩一区二区三区免费视频 | 国产日韩精品在线观看 | 国产大片黄色 | 五月天激情婷婷 | 99精品视频在线播放免费 | 国产手机精品视频 | 免费日韩电影 | 日韩精品电影在线播放 | 久久久久久久久久久久久国产精品 | 黄色影院在线播放 | aa级黄色大片 | www.夜夜操.com | 免费一级特黄毛大片 | 国产精品久久久99 | 五月天亚洲婷婷 | 91桃色免费观看 | 精品一二三四在线 | 17videosex性欧美 | 精品国产一区二区三区免费 | 狠狠色丁香婷婷综合橹88 | 日韩免费看视频 | 天天天天天天天天操 | 五月天久久激情 | 国产一级不卡毛片 | 亚洲欧美乱综合图片区小说区 | 激情深爱五月 | 五月婷香 | 欧美激情精品久久久久久变态 | 精品99999 | 婷婷国产精品 | 中文字幕网址 | 天天艹天天| 色婷婷av一区二 | 天天插天天干天天操 | 深夜福利视频在线观看 | 国产麻豆剧果冻传媒视频播放量 | 免费在线h | 亚洲午夜久久久久久久久 | 日本性视频 | 日韩二区在线播放 | 女人18片 | 久久久久国产精品一区二区 | 99国产高清| 久久精品一区 | 成人激情开心网 | 在线观看视频你懂 | 欧美另类调教 | 夜夜视频欧洲 | 91精品视频观看 | 91丨porny丨九色 | 欧美老少交 | 天天狠狠 | 欧美一级久久久 | 日b黄色片| 国产一级黄大片 | 91久久精品一区二区三区 | 欧美福利视频 | 婷婷在线观看视频 | 伊人久久精品久久亚洲一区 | 97色婷婷人人爽人人 | 欧美一级片播放 | 亚洲午夜久久久综合37日本 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 日本三级吹潮在线 | 欧美亚洲一区二区在线 | 二区三区视频 | 久久精品国产精品亚洲 | 在线观看亚洲免费视频 | 一级a性色生活片久久毛片波多野 | 91视频在线自拍 | 婷婷丁香激情网 | 欧美日韩天堂 | 91精品国产乱码久久 | 久久久久久毛片 | 99久久久久久国产精品 | 欧美日韩一二三四区 | 人人艹视频 | 国产欧美中文字幕 | 久久久午夜电影 | 在线免费av播放 | adc在线观看 | 伊人国产视频 | 久久久久国产精品免费免费搜索 | 黄色精品一区二区 | 亚洲欧美视频在线 | 中文字幕av日韩 | 国产中年夫妇高潮精品视频 | 日韩在线观看高清 | 视频 国产区 | 在线观看亚洲 | 免费在线观看日韩 | 国产午夜精品av一区二区 | 免费婷婷 | 免费看日韩 | 亚洲一级黄色av | 日韩毛片久久久 | 久久久99国产精品免费 | 久操伊人 | jizz999| 狠狠综合久久av | 国产精品视频 | 亚洲影院一区 | 东方av在线免费观看 | 久久精品在线 | 免费在线成人av电影 | 亚洲视频精品在线 | 欧美日韩国产网站 | 欧美人人爱 | 亚洲国产精品传媒在线观看 | 亚洲欧洲精品一区 | 正在播放五月婷婷狠狠干 |