历史上的今天
今天是:2026年01月09日(星期五)
2023年01月09日 | 基于S3c2440的I2C驱动与测试程序追踪交叉分析
2023-01-09 来源:elecfans
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]=%xn”,(e2prom_data.msgs[1]).buf[0]);
/***打印读出的值,没错的话,就应该是前面写的0x58了***/
close(fd);
return 0;
}
史海拾趣
|
ARM架构上网本电源解决方案 链接:http://www.eet-china.com/ART_8800590708_617703_TA_7cb3789c.HTM… 查看全部问答> |
|
我公司一直有大量的(Linux/UNIX) 以及ORACLE中的人才,如有需要,请加 MSN:xuchuang3344@hotmail.com 邮箱:xuchuang@uplooking.com ...… 查看全部问答> |
|
我用的wince5做的映像,底层的wince设备是pc104的板子,我首先在cf卡上做了98启动盘,然后将需要的类如nk.bin的几个文件拷贝到cf卡上,从而成功做成wince的启动盘,可是现在有一个问题想请教一下各位高人:我在启动菜单中选择本地启动后,正常加载 ...… 查看全部问答> |
|
意法半导体邀您参加《STM32全国巡回研讨会》,您不但可以深 意法半导体公司谨定于2007年12月11日-21日在全国十个城市举办STM32巡回研讨会,届时我们将为您讲解这款创新型嵌入式微控制器的优异特性。意法半导体公司全新推出的32位微控制器,内置ARM®Cortex-M3内核,是可同时满足16位和32位微控制器需 ...… 查看全部问答> |
|
设计要求:1.能产生正弦波、方波、三角波、锯齿波等4种周期性波形,并且可通过调节变形成其它相关波形。2.用键盘输入可生成正弦波的基波及各次谐波单独的波形,也可生成基波和各次谐波线形组合的波形。3.输出波形的频率范围为100MHz~1Hz;可以通过 ...… 查看全部问答> |
|
吉时利推出经济型、可编程的5位半数字多用表(DMM)拓展数字多用表系列产品 这款5位半数字多用表(DMM)具备6位半数字多用表(DMM)的测量能力,而且性价比更高 美国俄亥俄州克里夫兰,2012年09月17日讯--吉时利仪器公司,作为先进电性测试仪器与系统的行业领导者,在数字多用表(DMM)领域具有悠久的历史,最近又推出 ...… 查看全部问答> |




