platform匯流排上iic probe分析筆記

2022-09-23 09:54:07 字數 1986 閱讀 1258

/*下面是裝置提供給驅動的平台資料和資源,結構體在iic.**件中定義*/

static struct s3c2410_platform_i2c default_i2c_data0 __initdata = ;

static struct resource s3c_i2c_resource = ,

[1] = ,}; 

/*在驅動和裝置載入到匯流排上,並完成匹配的時候會呼叫驅動下面的probe函式驅動該硬體工作*/

在probe中初始化了三個結構體

struct s3c24xx_i2c *i2c;//在驅動檔案中定義的「大」結構體

struct s3c2410_platform_i2c *pdata;//這兩項是有裝置提供的。

struct resource *res;

下面是對「大」結構體中的介面卡(控制器)結構體(在iic.h中定義的)進行初始化

strlcpy(i2c->adap.name, "s3c2410-i2c", sizeof(i2c->adap.name));

i2c->adap.owner   = this_module;

i2c->adap.algo    = &s3c24xx_i2c_algorithm;

i2c->adap.retries = 2;

i2c->adap.class   = i2c_class_hwmon | i2c_class_spd;

i2c->tx_setup     = 50;

/* find the clock and enable it */

i2c->dev = &pdev->dev;

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

clk_enable(i2c->clk);

/* map the registers */

res = platform_get_resource(pdev, ioresource_mem, 0);//獲得裝置的ioresource_mem

i2c->ioarea = request_mem_region(res->start, resource_size(res),

pdev->name);//接著對「大」結構體初始化,這裡是申請io資源

i2c->regs = ioremap(res->start, resource_size(res));//對io對映

/* setup info block for the i2c core */

i2c->adap.algo_data = i2c;

i2c->adap.dev.parent = &pdev->dev;

/* initialise the i2c controller */

ret = s3c24xx_i2c_init(i2c);//初始化io控制器

/*s3c24xx_i2c_init()函式的作用就是initialise the controller,set the io lines and frequency*/

下面是對中斷的配置

i2c->irq = ret = platform_get_irq(pdev, 0);

ret = request_irq(i2c->irq, s3c24xx_i2c_irq, irqf_disabled,

dev_name(&pdev->dev), i2c);

ret = s3c24xx_i2c_register_cpufreq(i2c);

platform_set_drvdata(pdev, i2c);//將i2c大結構體的資料放在dev->p->driver_data = data;

clk_disable(i2c->clk);

至此,probe完成,其工作主要是對介面卡的初始化包含一些時鐘io和中斷資源的申請。

作業系統就是這樣,把資源都封裝起來,驅動寫起來更規範。

注意:這裡並沒有實現sysfs上的檔案的操作函式,就是open write等操作方法,自己可以加上,作為函式呼叫,提供給應用程式是用,寫個小的api玩一下。參考博文:

platform匯流排分析

推薦閱讀 講的很好 platform匯流排簡介 匯流排的產生的意義是讓裝置 硬體被抽象成乙個結構體來代表乙個裝置 和驅動分離 linux核心中常見的的匯流排有i2c匯流排,pci匯流排,串列埠匯流排,spi匯流排,pci匯流排,can匯流排,單匯流排等,所以有些裝置和驅動就可以掛在這些匯流排上,然後...

platform匯流排 學習

一直想要寫些部落格,記錄學習的過程,算是自己的乙個複習,也是鍛鍊一下自己的總結能力,但是一直到今天才開始。今天,學習的 platform匯流排。總的來說,platform匯流排是基於linux2.6核心的匯流排裝置驅動模型所自己定義出來的一條匯流排,具體為什麼要有這麼一條匯流排還沒有深入研究,目前覺...

Platform匯流排註冊驅動

linux核心中常見的的匯流排有i2c匯流排,pci匯流排,串列埠匯流排,spi匯流排,pci匯流排,can匯流排,單匯流排等,所以有些裝置和驅動就可以掛在這些匯流排上,然後通過匯流排上的match進行裝置和驅動的匹配。但是有的裝置並不屬於這些常見匯流排,所以我們引入了一種虛擬匯流排,也就是plat...