Hi3559AV100如何调试NVP6324 寄存器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xclshwd/article/details/88696222

NVP6324与主机通过I2C进行通讯的。为了方便调试NVP6324图像功能,方便调试各个寄存器的值,故添加一个可以获取和设置各个寄存器值ioctl,以便于应用层能可以动态设置。

首先在jaguar1_common.h定义一个结构体

typedef struct _rw_register_attr
{
	unsigned char flag;/**0:read;1:write*/
	unsigned char dev; /*0 or 1*/
	unsigned char bank;
	unsigned char addr;
	unsigned char val;
	unsigned char pos;
	unsigned char size;
	unsigned char reserved;
}rw_register_attr;

在jaguar1_ioctl.h中定义一个ioctl类型

#define IOC_RW_REGISTER 0xFD /**获取设置寄存器*/

在jaguar1_ioctl函数中添加如下

case IOC_RW_REGISTER :
{
	rw_register_attr reg_info;
	if(copy_from_user(&reg_info, argp, sizeof(rw_register_attr)))
	{
		printk("IOC_RW_REGISTER error\n");
	}
	if(reg_info.flag == 0) /*read*/
	{
		gpio_i2c_write(jaguar1_i2c_addr[reg_info.dev], 0xFF, 0x00);
		reg_info.val = gpio_i2c_read(jaguar1_i2c_addr[reg_info.dev], reg_info.addr);
	}
	else if(reg_info.flag == 1) /*write*/
	{
		vd_register_set(reg_info.dev, reg_info.bank, reg_info.addr, 
						 reg_info.val, reg_info.pos, reg_info.size);
	}
	
	copy_to_user(argp, &reg_info, sizeof(rw_register_attr));
	
}
break;

测试demo如下

#define NVP6324_DEV_NODE       "/dev/jaguar1"

int main(int argc, char **argv)
{

	rw_register_attr rw_reg_info;
	memset(&rw_reg_info, 0x0, sizeof(rw_register_attr));
	rw_reg_info.pos = 0;
	rw_reg_info.size = 8;
	if(argc <5)
	{
		printf("usage: nvp6324 <flag 0:read,1:write> <dev> <bank> <addr> <val> <pos> <size> \n");
		printf("sample: nvp6324 0 0 0 0x08 \n");
		printf("sample: nvp6324 1 0 0 0x08 1\n");
		return 0;
	}
	rw_reg_info.flag = strtoul(argv[1], NULL, 0);
	if(rw_reg_info.flag == 0 && argc == 5)
	{
		
		rw_reg_info.dev = strtoul(argv[2], NULL, 0);
		rw_reg_info.bank = strtoul(argv[3], NULL, 0);
		rw_reg_info.addr = strtoul(argv[4], NULL, 0);
	}
	else if(rw_reg_info.flag == 1 && argc == 6)
	{
		rw_reg_info.dev = strtoul(argv[2], NULL, 0);
		rw_reg_info.bank = strtoul(argv[3], NULL, 0);
		rw_reg_info.addr = strtoul(argv[4], NULL, 0);
		rw_reg_info.val = strtoul(argv[5], NULL, 0);
		
	}
	else if(rw_reg_info.flag == 1 && argc == 8)
	{
		rw_reg_info.dev = strtoul(argv[2], NULL, 0);
		rw_reg_info.bank = strtoul(argv[3], NULL, 0);
		rw_reg_info.addr = strtoul(argv[4], NULL, 0);
		rw_reg_info.val = strtoul(argv[5], NULL, 0);
		rw_reg_info.pos = strtoul(argv[6], NULL, 0);
		rw_reg_info.size = strtoul(argv[7], NULL, 0);
	}

	int m_fd_jaguar1 = -1;
	if(m_fd_jaguar1 < 0)
	{
		m_fd_jaguar1 = open(NVP6324_DEV_NODE, O_RDWR | O_NOCTTY| O_NONBLOCK);
		if (m_fd_jaguar1 < 0) {
			printf("nextchip dev open failed\n");
			return -1; 
		}
	}

	ioctl(m_fd_jaguar1, IOC_RW_REGISTER, &rw_reg_info);

	printf("[NVP6324]flag=%d dev=%d bank=%d addr=0x%x val=0x%x\n", rw_reg_info.flag, rw_reg_info.dev, rw_reg_info.bank, rw_reg_info.addr, rw_reg_info.val);

	close(m_fd_jaguar1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xclshwd/article/details/88696222