驅(qū)動開發(fā)-EEPROM讀寫技術(shù)_第1頁
驅(qū)動開發(fā)-EEPROM讀寫技術(shù)_第2頁
驅(qū)動開發(fā)-EEPROM讀寫技術(shù)_第3頁
驅(qū)動開發(fā)-EEPROM讀寫技術(shù)_第4頁
驅(qū)動開發(fā)-EEPROM讀寫技術(shù)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、EEPROM讀寫技術(shù)一、 確定任務1、 掌握基本的字符設備的驅(qū)動程序設計。2、 掌握基本的文件操作。3、 掌握在操作系統(tǒng)下的IIC驅(qū)動程序的原理。二、 學習內(nèi)容 1、 閱讀S5PV210數(shù)據(jù)手冊,熟悉IIC控制器的原理。2、 熟悉EEPROM器件FM24CL04的數(shù)據(jù)手冊。3、 編寫makefile文件。4、 下載并調(diào)試操作FM24CL04的應用程序。三、基礎(chǔ)知識1、 硬件原理:a) 原理圖:·b) 寄存器簡介:· 系統(tǒng)框圖:I2C控制器的主要作用是在SCL時鐘的同步下,將數(shù)據(jù)逐位移出IO引腳。I2C時序圖請讀者自行查看FM24CL04數(shù)據(jù)手冊。寄存器I2CCON主要最用是

2、設置分頻比。I2CSTAT狀態(tài)寄存器主要用于設置控制器的工作模式,設置起始與結(jié)束條件。I2CADD地址寄存器,用于保存從機地址。I2CDS數(shù)據(jù)移位寄存器,主要用于發(fā)送和接收數(shù)據(jù)。四、基本原理1、 I2C協(xié)議介紹:請讀者詳細查看AT24C系列EERPOM的數(shù)據(jù)手冊及IIC總線規(guī)范相關(guān)資料。2、 驅(qū)動原理:a)  Linux系統(tǒng)對I2C總線具有很好的支持。與硬件物理連接相對應的,Linux的I2C框架中各個部分的關(guān)系如下圖所示:b) 從上圖中,可以看出 Linux中,IIC的實現(xiàn)結(jié)構(gòu)分為四個層次:· IIC核心服務層,圖中i2c-core的地方,具體的實現(xiàn)代碼文件是在 /$(K

3、ERNEL_DIR)/drivers/i2c/i2c-core.c中。這一層主要的功能是向上、下兩層提供設備管理的服務,這些服務與具體的硬件底層無關(guān),下層的IIC總線控制器驅(qū)動(圖中Adapter)可以調(diào)用它的核心服務來向系統(tǒng)加入對該IIC總線的支持。而上層的具體與連接在該總線上的設備,如EEPROM,通訊的驅(qū)動程序可以調(diào)用核心層的服務與硬件設備進行讀寫等通訊。從這里我們可以看出這層主要起一個橋接的作用。· IIC總線驅(qū)動層,圖中Adapter的地方,在GEC210實驗板上,具體的實現(xiàn)代碼文件是在/$(KERNEL_DIR)/drivers/i2c/busses/i2c-s3c241

4、0.c中。這一層主要實現(xiàn)對具體的IIC總線控制器的驅(qū)動。具體控制器芯片的IIC控制方式不同,所以對不同的控制器要有不同的驅(qū)動,而對S5PV210 CPU來講,它的驅(qū)動就是i2c-s3c2410.c。該文件主要實現(xiàn)對控制器的初始化,然后調(diào)用核心服務層把S5PV210的IIC總線加入到 Linux Kernel中。· IIC設備驅(qū)動層,圖中client和i2c-dev的地方,具體的實現(xiàn)代碼在/$(KERNEL)/drivers/i2c/i2c-dev.c和/$(KERNEL)/drivers/i2c/chips目錄下的文件。這一層主要是調(diào)用核心服務層實現(xiàn)對在總線上的設備的操作。另外實現(xiàn)了

5、提供給用戶級應用程序的用戶操作總線的接口,如read、write和ioctl等。在GEC210實驗板中,i2c-dev.c實現(xiàn)的字符設備名為:/dev/i2c/0。表示的是系統(tǒng)的IIC總線0。應用程序可以通過該設備對這條總線上的設備進行控制。· 用戶應用程序,圖中program的地方,實驗中具體的對EEPROM的測試程序的讀寫測試程序是I2c_test.c。該應用程序,打開 /dev/i2c/0設備,通過ioctl對EEPROM地址進行設置。然后調(diào)用write系統(tǒng)調(diào)用寫EEPROM,再調(diào)用read 讀EEPROM對數(shù)據(jù)進行校驗。五、代碼設計 3、 驅(qū)動代碼簡析(詳細代碼請讀者查看/d

6、river/i2c/i2c-dev.c文件) ,I2C主控設備驅(qū)動程序節(jié)點,實現(xiàn)字符設備的打開、關(guān)閉、讀/寫、ioctrl等函數(shù)a) 設備注冊函數(shù)static int _init i2c_dev_init(void)res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops); /注冊名為“I2C”的設備i2c_dev_class = class_create(THIS_MODULE, "i2c-dev"); /創(chuàng)建I2C類設備res = i2c_add_driver(&i2cdev_driv

7、er); /注冊I2C總線驅(qū)動程序釋放設備函數(shù):static void _exit i2c_dev_exit(void)i2c_del_driver(&i2cdev_driver);class_destroy(i2c_dev_class);unregister_chrdev(I2C_MAJOR, "i2c");打開設備函數(shù):static int i2cdev_open(struct inode *inode, struct file *file)unsigned int minor = iminor(inode); /得到次設備號i2c_dev = i2c_dev_

8、get_by_minor(minor); /通過次設備號找到相應設備adap = i2c_get_adapter(i2c_dev->adap->nr); /得到與該次設備相關(guān)聯(lián)的IIC總線設配器client->adapter = adap;file->private_data = client; /傳遞給ioctl控制設備函數(shù):static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)struct i2c_client *client = file->privat

9、e_data; /open函數(shù)傳遞過來switch (cmd) case I2C_SLAVE: /不適用了,為了向前兼容case I2C_SLAVE_FORCE:case I2C_TENBIT: /設置標志,啟動(禁止)10位模式if (arg)client->flags |= I2C_M_TEN;elseclient->flags &= I2C_M_TEN;return 0;return 0;讀設備函數(shù):static ssize_t i2cdev_read(struct file *file, char _user *buf, size_t count,loff_t *o

10、ffset)struct i2c_client *client = file->private_data; /open函數(shù)傳遞ret = i2c_master_recv(client, tmp, count); /啟動總線,從器件讀數(shù)據(jù)ret = copy_to_user(buf, tmp, count) ? -EFAULT : ret; /將讀取的數(shù)據(jù)返回給用戶空間寫設備函數(shù):static ssize_t i2cdev_write(struct file *file, const char _user *buf,size_t count, loff_t *offset)struct i

11、2c_client *client = file->private_data;if (copy_from_user(tmp, buf, count) /將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間ret = i2c_master_send(client, tmp, count); /啟動總線,將要寫的數(shù)據(jù)發(fā)送到器件1、 drivers/i2c/i2c-core.c,I2C核心驅(qū)動程序,實現(xiàn)I2C設備(包括I2C總線適配器和I2C從設備)的注冊、刪除、通信等功能,主要函數(shù)如下:int i2c_add_driver(struct i2c_driver *driver),注冊IIC總線驅(qū)動程序。int i2

12、c_add_adapter(struct i2c_adapter *adap),注冊I2C控制器。int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num),啟動I2C總線,進行具體的讀寫操作。2、 drivers/i2c/busses/i2c-s3c2410.c,針對S5PV210的I2C控制器的驅(qū)動程序,主要代碼如下:a) 在調(diào)用 driver_register()的過程中,當找到一個合適的設備后,總線驅(qū)動程序調(diào)用該函數(shù):static int s3c24xx_i2c_probe(struct devi

13、ce *dev).i2c->clk = clk_get(&pdev->dev, "i2c");clk_enable(i2c->clk); /使能I2C控制器的時鐘i2c->ioarea = request_mem_region(res->start, (res->end-res->start)+1, pdev->name); .i2c->regs = ioremap(res->start, (res->end-res->start)+1); /映射寄存器,從物理空間映射到虛擬空間.ret = s

14、3c24xx_i2c_init(i2c); /初始化.ret = request_irq(i2c->irq, s3c24xx_i2c_irq, IRQF_DISABLED, dev_name(&pdev->dev), i2c); /向系統(tǒng)申請中斷ret = i2c_add_numbered_adapter(&i2c->adap);/向內(nèi)核注冊IIC適配器b) IIC控制器初始化函數(shù): static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c)unsigned long iicon = S3C2410_IICCON_

15、IRQEN | S3C2410_IICCON_ACKEN;pdata->cfg_gpio(to_platform_device(i2c->dev); /設置GPIO口的功能為SDA和SCLwriteb(pdata->slave_addr, i2c->regs + S3C2410_IICADD); /設置控制器的從機地址writel(iicon, i2c->regs + S3C2410_IICCON);if (s3c24xx_i2c_clockrate(i2c, &freq) != 0) /設置時鐘writel(0, i2c->regs + S3C24

16、10_IICCON);dev_err(i2c->dev, "cannot meet bus frequency requiredn");return -EINVAL;中斷函數(shù):static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id)status = readl(i2c->regs + S3C2410_IICSTAT); /讀IIC狀態(tài)i2s_s3c_irq_nextbyte(i2c, status); 根據(jù)狀態(tài)進行下一步的處理,如繼續(xù)讀、寫或終止總線的操作 c) 重要數(shù)據(jù)結(jié)構(gòu):/* i2c bus r

17、egistration info */static const struct i2c_algorithm s3c24xx_i2c_algorithm = .master_xfer= s3c24xx_i2c_xfer,/IIC總線通信傳輸算法,管理IIC控制器,實現(xiàn)IIC總線數(shù)據(jù)的發(fā)送和接收.functionality= s3c24xx_i2c_func,;3、 驅(qū)動程序的編譯:a) 進入內(nèi)核目錄,#make menuconfig -I2C support然后按下圖進行設置:進入I2C Hardware Bus support:b) 編譯生成內(nèi)核鏡像,將其燒寫到實驗箱上。4、 測試代碼編寫:#d

18、efine CHIP_ADDR 0x50#define PAGE_SIZE0x08#define I2C_DEV_PATH "/dev/i2c/0" /設備路徑static int read_eeprom(int fd, char buff, int addr, int count)int res;if(write(fd, &addr, 1) != 1)return -1;res=read(fd, buff, count);printf("read %d byte at 0x%.2xn", res, addr);return res;static

19、 int write_eeprom(int fd, char buff, int addr, int count)int res;int i;char sendbufferPAGE_SIZE+1;memcpy(sendbuffer+1, buff, count);sendbuffer0=addr; res= write(fd, sendbuffer, count+1); printf("write %d byte at 0x%.2xn", res ,addr);int main(void)int fd, n, res;unsigned char bufPAGE_SIZE;f

20、d = open(I2C_DEV_PATH, O_RDWR); /打開I2C設備if(fd < 0)printf("#i2c test device open fail#n");return (-1);printf("success, i2c open file device %d n",fd);res = ioctl(fd, I2C_TENBIT,0);/設置不使用10位地址模式res = ioctl(fd, I2C_SLAVE_FORCE, CHIP_ADDR);/設置從器件的地址printf("ioctl I2C_SLAVE_FORCE msg NO:%dn",res);for(n=0; n<PAGE_SIZE; n+)bufn=n;write_eeprom(f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論