根据前一篇的文章介绍 at24c02的读写方式有很多种,
写有两种1.写一字节数据到word address处2.从指定的word address处开始写一页数据,此word address需要页对齐!
读有三种1.从at24c02当前的word address读一字节数据2.从指定的word address 读数据3.从当前的word address地址开始读一串数据
根据驱动中write() read()的实现方法可以发现,当msg发送完毕时才发送stop信号,而msg之间是是连续发送的不会插入stop信号。
但是,write() read()每次都固定只能发送一则msg!这对at24c02的写以及current read、sequential read来说没问题,可以通过write()和read()函数直接实现这四种操作。
但是at24c02的random read就不能直接通过write() read()来实现了。因为random read需要先写word address,写完之后不能直接发送stop信号,
而是要接着发送start信号开始发送device address。而驱动中的write() read()只能一次发送一则msg,并且发送完毕就发送stop信号,所以这种时序不符合random read的操作。
不过系统通过ioctl操作,可以一次发送多则msg,而在msg之间是不会发送stop信号的。
所以at24c02的random read操作可以通过发送两则msg的方式来实现,第一则msg是写的,并且写的内容是word address,第二则msg为读。
下面在分析下ioctl 的驱动实现函数i2cdev_ioctl_rdrw()
staticnoinlineinti2