驅動開發-EEPROM讀寫技術_第1頁
驅動開發-EEPROM讀寫技術_第2頁
驅動開發-EEPROM讀寫技術_第3頁
驅動開發-EEPROM讀寫技術_第4頁
驅動開發-EEPROM讀寫技術_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

6、river/i2c/i2c-dev.c文件) ,I2C主控設備驅動程序節點,實現字符設備的打開、關閉、讀/寫、ioctrl等函數a) 設備注冊函數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"); /創建I2C類設備res = i2c_add_driver(&i2cdev_driv

7、er); /注冊I2C總線驅動程序釋放設備函數:static void _exit i2c_dev_exit(void)i2c_del_driver(&i2cdev_driver);class_destroy(i2c_dev_class);unregister_chrdev(I2C_MAJOR, "i2c");打開設備函數: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); /得到與該次設備相關聯的IIC總線設配器client->adapter = adap;file->private_data = client; /傳遞給ioctl控制設備函數:static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)struct i2c_client *client = file->privat

9、e_data; /open函數傳遞過來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;讀設備函數: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函數傳遞ret = i2c_master_recv(client, tmp, count); /啟動總線,從器件讀數據ret = copy_to_user(buf, tmp, count) ? -EFAULT : ret; /將讀取的數據返回給用戶空間寫設備函數: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) /將用戶空間的數據拷貝到內核空間ret = i2c_master_send(client, tmp, count); /啟動總線,將要寫的數據發送到器件1、 drivers/i2c/i2c-core.c,I2C核心驅動程序,實現I2C設備(包括I2C總線適配器和I2C從設備)的注冊、刪除、通信等功能,主要函數如下:int i2c_add_driver(struct i2c_driver *driver),注冊IIC總線驅動程序。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控制器的驅動程序,主要代碼如下:a) 在調用 driver_register()的過程中,當找到一個合適的設備后,總線驅動程序調用該函數: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); /向系統申請中斷ret = i2c_add_numbered_adapter(&i2c->adap);/向內核注冊IIC適配器b) IIC控制器初始化函數: 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;中斷函數:static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id)status = readl(i2c->regs + S3C2410_IICSTAT); /讀IIC狀態i2s_s3c_irq_nextbyte(i2c, status); 根據狀態進行下一步的處理,如繼續讀、寫或終止總線的操作 c) 重要數據結構:/* i2c bus r

17、egistration info */static const struct i2c_algorithm s3c24xx_i2c_algorithm = .master_xfer= s3c24xx_i2c_xfer,/IIC總線通信傳輸算法,管理IIC控制器,實現IIC總線數據的發送和接收.functionality= s3c24xx_i2c_func,;3、 驅動程序的編譯:a) 進入內核目錄,#make menuconfig -I2C support然后按下圖進行設置:進入I2C Hardware Bus support:b) 編譯生成內核鏡像,將其燒寫到實驗箱上。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論