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(®_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, ®_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;
}