V210 SPI驱动分析
? ? 對(duì)于總線設(shè)備驅(qū)動(dòng),是需要分別創(chuàng)建設(shè)備和驅(qū)動(dòng)兩個(gè)結(jié)構(gòu)體,然后根據(jù)name,互相匹配,匹配成功后,調(diào)用?
? ? 驅(qū)動(dòng)的probe函數(shù),然后創(chuàng)建設(shè)備文件,實(shí)現(xiàn)驅(qū)動(dòng)的業(yè)務(wù)邏輯。
? ? 因此,我們就以設(shè)備和驅(qū)動(dòng)的注冊(cè),以及匹配來(lái)分析。
? ? 創(chuàng)建設(shè)備
1. 首先在arch/arm/mach-s5pv210/mach-x210.c (我這里用是mach-x210.c不同的bsp,這個(gè)文件不一定一樣)。
? ? 定義我們的spi設(shè)備硬件相關(guān)的結(jié)構(gòu)體,spi_board_info
? ? ?然后調(diào)用?spi_register_board_info注冊(cè)。
? ? ?注意,在我這版內(nèi)核中,并不是注冊(cè)spi_board_info了就會(huì)創(chuàng)建spi_device(spi設(shè)備結(jié)構(gòu)體)
2. ?接下來(lái)我們看spi控制器驅(qū)動(dòng)的probe函數(shù),spi_device的創(chuàng)建實(shí)際是這里創(chuàng)建的
? ? ?s3c64xx_spi_probe (drivers/spi/spi_s3c64xx.c) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ??spi_register_master (drivers/spi/spi.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ?scan_boardinfo ?(drivers/spi/spi.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?spi_new_device ??(drivers/spi/spi.c)
? ? 驅(qū)動(dòng)注冊(cè)以及驅(qū)動(dòng)和設(shè)備的匹配
1. 在我們的spi設(shè)備驅(qū)動(dòng)里的init函數(shù)里,調(diào)用spi_register_driver來(lái)向系統(tǒng)注冊(cè)spi_driver
2. 驅(qū)動(dòng)與設(shè)備的匹配,以及驅(qū)動(dòng)的probe函數(shù)
? ? ?spi_register_driver ?(drivers/spi/spi.c)
? ? ? ? ? ? ? ??driver_register ? ?(drivers/base/driver.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ??bus_add_driver ? ?(drivers/base/bus.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?driver_attach ? ?(drivers/base/dd.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??__driver_attach ? ??(drivers/base/dd.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??driver_match_device ? ? ?(drivers/base/dd.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??drv->bus->match(dev, drv) ? (drivers/base/base.h)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?spi_match_device ??(drivers/spi/spi.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??driver_probe_device ? ? ?(drivers/base/dd.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?really_probe ? ?(drivers/base/dd.c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?drv->probe(dev)
static int spi_match_device(struct device *dev, struct device_driver *drv)
{
const struct spi_device *spi = to_spi_device(dev);
const struct spi_driver *sdrv = to_spi_driver(drv);
if (sdrv->id_table)
return !!spi_match_id(sdrv->id_table, spi);
? ? ? ? ?
return strcmp(spi->modalias, drv->name) == 0;
}
從上面這個(gè)匹配函數(shù)可以看出匹配有兩種方式id_table或者modailas和name,匹配成功后,就會(huì)調(diào)用我們的spi驅(qū)動(dòng)的
probe函數(shù)了。
總結(jié)
以上是生活随笔為你收集整理的V210 SPI驱动分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: u-boot向linux内核传递启动参数
- 下一篇: socket 编程入门教程(一)TCP