日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]本文將介紹Linux中AT24C02驅動。AT24C02是一種EEPROM,使用I2C接口來訪問。在開發(fā)板中,使用I2C控制器0和AT24C02連接,這里就不給出原理圖了,如需要,可以搜索TQ2440開發(fā)板的原理圖。目標平臺:TQ2440CPU:s3c2440內

本文將介紹Linux中AT24C02驅動。AT24C02是一種EEPROM,使用I2C接口來訪問。

在開發(fā)板中,使用I2C控制器0和AT24C02連接,這里就不給出原理圖了,如需要,可以搜索TQ2440開發(fā)板的原理圖。

目標平臺:TQ2440

CPU:s3c2440

內核版本:2.6.32

本文所有的代碼均位于內核源碼:linux/drivers/misc/eeprom/at24.c中。

1. 模塊注冊和注銷


staticint__initat24_init(void)

{

/*將io_limit向下圓整到最近的2的冪*/

io_limit=rounddown_pow_of_two(io_limit);

returni2c_add_driver(&at24_driver);/*i2c驅動注冊*/

}

module_init(at24_init);

staticvoid__exitat24_exit(void)

{

i2c_del_driver(&at24_driver);

}

module_exit(at24_exit);

MODULE_DESCRIPTION("DriverformostI2CEEPROMs");

MODULE_AUTHOR("DavidBrownellandWolframSang");

MODULE_LICENSE("GPL");


注冊函數很簡單。io_limit為寫入時允許一次寫入的最大字節(jié),該參數為驅動模塊參數,可由用戶設置,默認值為128字節(jié)。

首先對io_limit向下圓整到最近的2的冪,接著直接調用了i2c_add_driver來注冊一個i2c驅動。

注銷函數更簡單。注銷之前注冊的i2c驅動。


2. 設備驅動綁定

熟悉I2C驅動架構的可能會知道I2C驅動的match函數,該函數將使用id表(struct i2c_device_id)和i2c設備(struct i2c_client)進行匹配,判斷是否有name字段相同,如果相同則匹配完成,即可完成設備和驅動的綁定,接著便會調用驅動提供的probe方法。我們來看下驅動提供的id表。


staticstructi2c_driverat24_driver={

.driver={

.name="at24",

.owner=THIS_MODULE,

},

.probe=at24_probe,

.remove=__devexit_p(at24_remove),

.id_table=at24_ids,

};

驅動提供的id為at24_ids,如下:


staticconststructi2c_device_idat24_ids[]={

/*needs8addressesasA0-A2areignored*/

{"24c00",AT24_DEVICE_MAGIC(128/8,AT24_FLAG_TAKE8ADDR)},

/*oldvariantscan'tbehandledwiththisgenericentry!*/

{"24c01",AT24_DEVICE_MAGIC(1024/8,0)},

{"24c02",AT24_DEVICE_MAGIC(2048/8,0)},

/*spdisa24c02inmemoryDIMMs*/

{"spd",AT24_DEVICE_MAGIC(2048/8,

AT24_FLAG_READONLY|AT24_FLAG_IRUGO)},

{"24c04",AT24_DEVICE_MAGIC(4096/8,0)},

/*24rf08quirkishandledati2c-core*/

{"24c08",AT24_DEVICE_MAGIC(8192/8,0)},

{"24c16",AT24_DEVICE_MAGIC(16384/8,0)},

{"24c32",AT24_DEVICE_MAGIC(32768/8,AT24_FLAG_ADDR16)},

{"24c64",AT24_DEVICE_MAGIC(65536/8,AT24_FLAG_ADDR16)},

{"24c128",AT24_DEVICE_MAGIC(131072/8,AT24_FLAG_ADDR16)},

{"24c256",AT24_DEVICE_MAGIC(262144/8,AT24_FLAG_ADDR16)},

{"24c512",AT24_DEVICE_MAGIC(524288/8,AT24_FLAG_ADDR16)},

{"24c1024",AT24_DEVICE_MAGIC(1048576/8,AT24_FLAG_ADDR16)},

{"at24",0},

{/*ENDOFLIST*/}

};


結構體成員的第一個參數即為name,表示設備的名字。第二個參數,在該驅動中,為一個幻術(magic),通過AT24_DEVICE_MAGIC宏計算。

宏第一個參數為eeprom的大小,第二參數為一些標志位。我們看下這個宏:


#defineAT24_SIZE_BYTELEN5

#defineAT24_SIZE_FLAGS8

/*createnon-zeromagicvalueforgiveneepromparameters*/

#defineAT24_DEVICE_MAGIC(_len,_flags)

((1<

<

在這個表中,針對這里講解的24c02,其大小為256字節(jié),標志位為空。



3.probe函數

當i2c總線完成設備驅動綁定后,就會調用probe方法了。具體看下這個函數。


staticintat24_probe(structi2c_client*client,conststructi2c_device_id*id)

{

structat24_platform_datachip;

boolwritable;

booluse_smbus=false;

structat24_data*at24;

interr;

unsignedi,num_addresses;

kernel_ulong_tmagic;

/*獲取板級設備信息*/

if(client->dev.platform_data){

chip=*(structat24_platform_data*)client->dev.platform_data;

}else{

/*沒有板級設備信息,也沒有driver_data,直接出錯*/

if(!id->driver_data){

err=-ENODEV;

gotoerr_out;

}

magic=id->driver_data;

chip.byte_len=BIT(magic&AT24_BITMASK(AT24_SIZE_BYTELEN));

magic>>=AT24_SIZE_BYTELEN;

chip.flags=magic&AT24_BITMASK(AT24_SIZE_FLAGS);

/*

*Thisisslow,butwecan'tknowalleeproms,sowebetter

*playsafe.Specifyingcustomeeprom-typesviaplatform_data

*isrecommendedanyhow.

*/

chip.page_size=1;

chip.setup=NULL;

chip.context=NULL;

}

/*檢查參數,

byte_len和page_size必須為2的冪,不是則打印警告*/

if(!is_power_of_2(chip.byte_len))

dev_warn(&client->dev,

"byte_lenlookssuspicious(nopowerof2)!n");

if(!is_power_of_2(chip.page_size))

dev_warn(&client->dev,

"page_sizelookssuspicious(nopowerof2)!n");

/* Use I2C operations unless we're stuck with SMBus e

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉