取消
显示结果 
搜索替代 
您的意思是: 
Highlighted
Observer
Observer
238 次查看
注册日期: ‎09-21-2018

ZYNQ IIC驱动报错:Resource temporarily unavailable

hi,

    我在调试linux下IIC读写eeprom时遇到一点问题。

    硬件采用zynq7020,linux内核使用的是xilinx-linux-2018.2,内核配置中,使能了CONFIG_I2C_XILINX=y,并选择了eeprom支持,将eeprom驱动编译进内核。

    设备树中添加了eeprom节点

&i2c0 {
    status = "okay";
    clock-frequency = <400000>;

    eeprom@50 {
        compatible = "at,24c32";
        reg = <0x50>;
    };
};

系统启动后,能在/dev下找到i2c-0节点,/sys/bus/i2c/devices下出现了0-0050节点,/sys/bus/i2c/drivers/下出现了at24目录。

编写了简单的应用程序进行读写测试,代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>


#define		I2C_SLAVE		0x0703
#define		I2C_TIMEOUT		0x0702
#define		I2C_RETRIES		0x0701
#define		I2C_SLAVE_ADDR	0x50



int main(void)
{
    int fd;
	char wr_buf[32];
	char rd_buf[32];
	int i;
    
    fd = open("/dev/i2c-0", O_RDWR);
    if(fd < 0){
        perror("open failed");
		return -1;
    }
	printf("open /dev/i2c-0 success.\n");

	if(ioctl(fd, I2C_SLAVE, I2C_SLAVE_ADDR) < 0){
		perror("ioctl failed");
		close(fd);
		return -1;
	}

	if(ioctl(fd, I2C_TIMEOUT, 1) < 0){
		perror("ioctl failed");
		close(fd);
		return -1;
	}

	if(ioctl(fd, I2C_RETRIES, 1) < 0){
		perror("ioctl failed");
		close(fd);
		return -1;
	}

	wr_buf[0] = 0x0;//first addr
	wr_buf[1] = 0x0;//second addr
	wr_buf[2] = 0x66;//val to be write
	for(i=0; i<3; i++){
		if(write(fd, &wr_buf[i], 1) < 0){
			perror("write data");
		}
		usleep(10000);
	}

	wr_buf[0] = 0x0;//first addr
	wr_buf[1] = 0x0;//second addr
	if(write(fd, wr_buf, 2) < 0){
		perror("write read-address");
	}
	usleep(10000);

	rd_buf[0] = 0;
	if(read(fd, rd_buf, 1) < 0){
		perror("read");
	}
	printf("read : %#x\n", rd_buf[0]);

    //while(1);

    return 0;
}

执行应用程序,write()会返回错误信息

write.png

此外,尝试了ioctl()的方式进行读写,一样返回Resource temporarily unavaliable

不知是哪的问题,还请各位多多指点

0 项奖励
1 条回复1
Highlighted
Xilinx Employee
Xilinx Employee
190 次查看
注册日期: ‎04-15-2011

回复: ZYNQ IIC驱动报错:Resource temporarily unavailable

@keep 

你尝试过wiki I2C driver页面提供的testeeprom.c, 如果没有,请在你板上试试。

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842160/Cadence+I2C+Driver

另外,打开完整的dts,看看pinctrl属性是否设置正确。

-------------------------------------------------------------------------
Don't forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------