vmware虚拟机+fedora10, 硬件平台tq2440, 内核2.6.30.4
对应的驱动程序豁然开朗, 然后自己添加了一些dev_dbg后, 对于不理解的地方也有了一定的参考提示, 记录下来与大家分享。
测试程序如下:
/*i2c_test.c
* hongtao_liu
*/
#include
#include
#include
#include
#include
#include
#include
#include
#define i2c_retries 0x0701
#define i2c_timeout 0x0702
#define i2c_rdwr 0x0707
/*********定义struct i2c_rdwr_ioctl_data和struct i2c_msg,要和内核一致*******/
struct i2c_msg
{
unsigned short addr;
unsigned short flags;
#define i2c_m_ten 0x0010
#define i2c_m_rd 0x0001
unsigned short len;
unsigned char *buf;
};
struct i2c_rdwr_ioctl_data
{
struct i2c_msg *msgs;
int nmsgs;
/* nmsgs这个数量决定了有多少开始信号,对于“单开始时序”,取1*/
};
/***********主程序***********/
int main()
{
int fd,ret;
struct i2c_rdwr_ioctl_data e2prom_data;
fd=open(“/dev/i2c-0”,o_rdwr);
/*
*dev/i2c-0是在注册i2c-dev.c后产生的,代表一个可操作的适配器。如果不使用i2c-dev.c
*的方式,就没有,也不需要这个节点。
*/
if(fd《0)
{
perror(“open error”);
}
e2prom_data.nmsgs=2;
/*
*因为操作时序中,最多是用到2个开始信号(字节读操作中),所以此将
*e2prom_data.nmsgs配置为2
*/
e2prom_data.msgs=(struct i2c_msg*)malloc(e2prom_data.nmsgs*sizeof(struct i2c_msg));
if(!e2prom_data.msgs)
{
perror(“malloc error”);
exit(1);
}
ioctl(fd,i2c_timeout,1);/*超时时间*/
ioctl(fd,i2c_retries,2);/*重复次数*/
/***write data to e2prom**/
e2prom_data.nmsgs=1;
(e2prom_data.msgs[0]).len=2; //1个 e2prom 写入目标的地址和1个数据
(e2prom_data.msgs[0]).addr=0x50;//e2prom 设备地址
(e2prom_data.msgs[0]).flags=0; //write
(e2prom_data.msgs[0]).buf=(unsigned char*)malloc(2);
(e2prom_data.msgs[0]).buf[0]=0x10;// e2prom 写入目标的地址
(e2prom_data.msgs[0]).buf[1]=0x58;//the data to write
ret=ioctl(fd,i2c_rdwr,(unsigned long)&e2prom_data);
if(ret《0)
{
perror(“ioctl error1”);
}
sleep(1);
/******read data from e2prom*******/
e2prom_data.nmsgs=2;
(e2prom_data.msgs[0]).len=1; //e2prom 目标数据的地址
(e2prom_data.msgs[0]).addr=0x50; // e2prom 设备地址
(e2prom_data.msgs[0]).flags=0;//write
(e2prom_data.msgs[0]).buf[0]=0x10;//e2prom数据地址
(e2prom_data.msgs[1]).len=1;//读出的数据
(e2prom_data.msgs[1]).addr=0x50;// e2prom 设备地址
(e2prom_data.msgs[1]).flags=i2c_m_rd;//read
(e2prom_data.msgs[1]).buf=(unsigned char*)malloc(1);//存放返回值的地址。
(e2prom_data.msgs[1]).buf[0]=0;//初始化读缓冲
ret=ioctl(fd,i2c_rdwr,(unsigned long)&e2prom_data);
if(ret《0)
{
perror(“ioctl error2”);
}
printf(“buff[0]=%x\n”,(e2prom_data.msgs[1]).buf[0]);
/***打印读出的值,没错的话,就应该是前面写的0x58了***/
close(fd);
return 0;
}
防近视坐姿矫正提醒器中角度感应开关YTJM-DSQ160TP-Q15的原理与选型
气密性封装和非气密性封装介绍
台北LED路灯冲击生态?
智能仓库未来应用:移动式RFID仓库管理解决方案
2020年第四季度中国智能手机市场出货量约8640万台
基于S3c2440的I2C驱动与测试程序追踪交叉分析
台积电正计划在美国建造当前世界上最先进的芯片工厂
谨慎选择USB音频微控制器:测试台上的惊险故事
国产神机双曲全面屏S8:小米MIX被抄哭,苹果三星齐看待
主板用的DC to DC脉冲宽度调制(PWM)电路图
必达安保系统G456M4-65A门锁简介
Raspberry Pi完成直线平台的设计全过程
Micro LED相比于其他显示技术有什么优势?
51单片机编程开发之C语言基础一
iOS11 beta2推出还隐藏了27个功能更新,苹果没告诉你嘛?
一加3T终于吃到牛轧糖 一加3/3T开始推送氢OS3.0
信步科技SV1-25526P-B主板规格英文版
在电路图中电阻器和电位器的单位标注规则和使用常识
TT electronics支持KTM 向市场推出革新性Freeride E电动摩托车
AMD二代霄龙曝光 64核心128线程三级缓存256MB