/*下面是裝置提供給驅動的平台資料和資源,結構體在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...