您的位置:首页

RK3288获取摄像头的Sensor ID【原创】

2017-11-18 14:48 183 查看
平台信息:
内核:linux3.0.68
系统:android/android6.0
平台:RK3288


作者:庄泽彬(欢迎转载,请注明作者)

邮箱:2760715357@qq.com

说明:通过I2C总线获取摄像头的ID号。

一、查看规格书,确定摄像头存放ID号的寄存器地址.



二、应用层通过I2C总线的编程模型获取摄像头的Sensor ID.详细的代码如下:

camera.cpp

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>           /* Definition of AT_* constants */
#include <unistd.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <dlfcn.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <string.h>
#include <pthread.h>
//#include <linux/videodev.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
//#include <linux/ion.h>
//#include "ion.h"
#include "../../system/core/libion/kernel-headers/linux/rockchip_ion.h"
//#include <linux/android_pmem.h>
#include <linux/videodev2.h>
#include <linux/fb.h>
#include <linux/version.h>

#include "camsys_head.h"

#define CAMSYS_DEVNAME "/dev/camsys_marvin"

static int camsys_fd = -1;

//hkw add;
int extdev_register()
{
int err = 0;
int numLane = 2;
camsys_devio_name_t extdev;

extdev.dev_id = CAMSYS_DEVID_SENSOR_1B;
strlcpy((char*)extdev.avdd.name, "NC",sizeof(extdev.avdd.name));
extdev.avdd.min_uv = 0;
extdev.avdd.max_uv = 0;
strlcpy((char*)extdev.dovdd.name,"NC",sizeof(extdev.dovdd.name));
extdev.dovdd.min_uv = 18000000;
extdev.dovdd.max_uv = 18000000;
strlcpy((char*)extdev.dvdd.name, "NC",sizeof(extdev.dvdd.name));
strlcpy((char*)extdev.afvdd.name, "NC",sizeof(extdev.afvdd.name));
strlcpy((char*)extdev.pwrdn.name, "RK30_PIN2_PB7",sizeof(extdev.pwrdn.name));
extdev.pwrdn.active = 0x00;
strlcpy((char*)extdev.pwren.name, "RK30_PIN0_PC1",sizeof(extdev.pwren.name));
extdev.pwren.active = 0x01;
strlcpy((char*)extdev.rst.name,"RK30_PIN2_PB5",sizeof(extdev.rst.name));
extdev.rst.active = 0x0;
strlcpy((char*)extdev.afpwrdn.name,"NC",sizeof(extdev.afpwrdn.name));
strlcpy((char*)extdev.afpwr.name,"NC",sizeof(extdev.afpwr.name));
extdev.phy.type = CamSys_Phy_Mipi;
//extdev.phy.info.mipi.phy_index = 1; //MIPI_PHY_INDEX;
extdev.phy.info.mipi.data_en_bit = 0x01; //?

/*if (numLane == 1) {
extdev.phy.info.mipi.data_en_bit = 0x01;
extdev.phy.info.mipi.bit_rate = 656;
} else if (numLane == 2) {
extdev.phy.info.mipi.data_en_bit = 0x03;
extdev.phy.info.mipi.bit_rate = 328;
} else if (numLane == 4) {
extdev.phy.info.mipi.data_en_bit = 0x0f;
extdev.phy.info.mipi.bit_rate = 408;
}*/
extdev.clk.in_rate = 24000000;

printf("----CAMSYS_REGISTER_DEVIO----\n");
err = ioctl(camsys_fd, CAMSYS_REGISTER_DEVIO, &extdev);
if (err<0) {
printf("CAMSYS_REGISTER_DEVIO failed\n");
}

return err;
}

//int extdev_init(unsigned int *i2cbase)
int extdev_init()
{
int err,i2cbytes,i;
struct rk_sensor_reg *sensor_reg;
unsigned char *i2cchar;
camsys_sysctrl_t sysctl;
camsys_i2c_info_t i2cinfo;
int id = 0;

sysctl.dev_mask = (CAMSYS_DEVID_SENSOR_1B & HAL_DEVID_EXTERNAL);
sysctl.ops = CamSys_Avdd;
sysctl.on = 1;
err = ioctl(camsys_fd, CAMSYS_SYSCTRL, &sysctl);
if (err<0) {
printf("CamSys_Avdd on failed!");
}

sysctl.ops = CamSys_Dvdd;
sysctl.on = 1;
err = ioctl(camsys_fd, CAMSYS_SYSCTRL, &sysctl);
if (err<0) {
printf("CamSys_Dvdd on failed!\n");
}

sysctl.ops = CamSys_Dovdd;
sysctl.on = 1;
err = ioctl(camsys_fd, CAMSYS_SYSCTRL, &sysctl);
if (err<0) {
printf("CamSys_Dovdd on failed!");
}
usleep(5000);

sysctl.dev_mask = (CAMSYS_DEVID_SENSOR_1B | CAMSYS_DEVID_MARVIN);
sysctl.ops = CamSys_ClkIn;
sysctl.on = 1;
err = ioctl(camsys_fd, CAMSYS_SYSCTRL, &sysctl);
if (err<0) {
printf("CamSys_ClkIn on failed\n");
}

//1)power en
usleep(1000);
sysctl.dev_mask = (CAMSYS_DEVID_SENSOR_1B & HAL_DEVID_EXTERNAL);
sysctl.ops = CamSys_PwrEn;
sysctl.on = 1;
err = ioctl(camsys_fd, CAMSYS_SYSCTRL, &sysctl);
if (err<0) {
printf("CamSys_PwrEn on failed");
}

//2)reset
usleep(1000);
sysctl.ops = CamSys_Rst;
sysctl.on = 0;
err = ioctl(camsys_fd, CAMSYS_SYSCTRL, &sysctl);
if (err<0) {
printf("CamSys_Rst on failed\n");
}

//3)power down control
usleep(1000);
//sysctl.dev_mask = CAMSYS_DEVID_SENSOR_1B;
sysctl.ops = CamSys_PwrDn;
sysctl.on = 0;
err = ioctl(camsys_fd, CAMSYS_SYSCTRL, &sysctl);
if (err<0) {
printf("CamSys_PwrDn on failed");
}
usleep(2000);

i2cinfo.bus_num = 3;
i2cinfo.slave_addr = 0x6C; //0x6c; //0x20;
i2cinfo.reg_addr = 0x0103;
i2cinfo.reg_size = 2;
i2cinfo.val = 0x01;
i2cinfo.val_size = 0x01;
i2cinfo.i2cbuf_directly = 0;
i2cinfo.speed = 100000;

err = ioctl(camsys_fd, CAMSYS_I2CWR, &i2cinfo);
if(err<0) {
printf("softreset::CAMSYS_I2CWR failed\n");
i2cinfo.slave_addr = 0x20;
err = ioctl(camsys_fd, CAMSYS_I2CWR, &i2cinfo);
if(err<0){
printf("softreset  again::CAMSYS_I2CWR failed\n");
printf("zhuang:{ ID:0x%x }\n",id);
goto end;
}
}/* else {
printf("I2c write: 0x%x : 0x%x\n",i2cinfo.reg_addr,i2cinfo.val);
}*/

usleep(5000);

i2cinfo.reg_addr = 0x300a;
i2cinfo.val_size = 0x01;
err = ioctl(camsys_fd, CAMSYS_I2CRD, &i2cinfo);
if (err<0) {
printf("CAMSYS_I2CRD failed\n");
printf("zhuang:{ ID:0x%x }\n",id);
goto end;
} else {
printf("I2c read: 0x%x : 0x%x\n",i2cinfo.reg_addr,i2cinfo.val);
id = (i2cinfo.val<<8);
}

i2cinfo.reg_addr = 0x300b;
err = ioctl(camsys_fd, CAMSYS_I2CRD, &i2cinfo);
if (err<0) {
printf("CAMSYS_I2CRD failed\n");
printf("{ ID:0x%x }\n",id);
goto end;
} else {
printf("I2c read: 0x%x : 0x%x\n",i2cinfo.reg_addr,i2cinfo.val);
id |= i2cinfo.val;
}

i2cinfo.reg_addr = 0x3011;
err = ioctl(camsys_fd, CAMSYS_I2CRD, &i2cinfo);
if (err<0) {
printf("CAMSYS_I2CRD failed\n");
printf("{ ID:0x%x }\n",id);
goto end;
} else {
printf("IO Streng I2c read: 0x%x : 0x%x\n",i2cinfo.reg_addr,i2cinfo.val);
}
fprintf(stderr,"zhuang-cam:0x%x\r\n",id);
printf("\n!!!!!!!!!!Back Camera ID: 0x%x; default:0x008858!!!!!!!!!!\n",id);
if(id == 0x5648){
printf("{ ID:0x%x }\n",id);
}else{
printf("{ ID:0x%x }\n",id);
}
/*
i2cinfo.reg_addr = 0x300c;
err = ioctl(camsys_fd, CAMSYS_I2CRD, &i2cinfo);
if (err<0) {
printf("CAMSYS_I2CRD failed\n");
} else {
printf("I2c read: 0x%x : 0x%x\n",i2cinfo.reg_addr,i2cinfo.val);
}

i2cinfo.reg_addr = 0x302a;
err = ioctl(camsys_fd, CAMSYS_I2CRD, &i2cinfo);
if (err<0) {
printf("CAMSYS_I2CRD failed\n");
} else {
printf("I2c read: 0x%x : 0x%x\n",i2cinfo.reg_addr,i2cinfo.val);
}
*/
/*
i2cchar = (unsigned char*)i2cbase;
sensor_reg = sensor_test;
i2cbytes = 0x00;
for (i=0; i<sizeof(sensor_test)/sizeof(struct rk_sensor_reg); i++) {
*i2cchar++ = (sensor_reg->reg&0xff00)>>8;
*i2cchar++ = (sensor_reg->reg&0xff);
*i2cchar++ = (sensor_reg->val&0xff);
sensor_reg++;
i2cbytes += 3;
}

i2cinfo.bus_num = 3;
i2cinfo.slave_addr = 0x6c;
i2cinfo.i2cbuf_directly = 1;
i2cinfo.i2cbuf_bytes = ((3<<16)|i2cbytes);
i2cinfo.speed = 100000;
err = ioctl(camsys_fd, CAMSYS_I2CWR, &i2cinfo);
if (err<0) {
printf("CAMSYS_I2CWR buf failed\n");
}
printf("Sensor init!\n");
*/
end:
return 0;
}

int main(int argc,char **argv)
{
int ret = -1;
camsys_devio_name_t extdev;
camsys_i2c_info_t i2cinfo;
int id = 0;

ret = access(CAMSYS_DEVNAME,O_RDWR);
if(ret < 0){
printf("access %s failed\r\n",CAMSYS_DEVNAME);
return -1;
}

camsys_fd = open(CAMSYS_DEVNAME,O_RDWR);
if(camsys_fd < 0){
printf("open %s failed\r\n",CAMSYS_DEVNAME);
return -1;
}

extdev_register();
extdev_init();

if(camsys_fd > 0)
close(camsys_fd);

printf("camera:id = 0x%x\r\n",id);

return 0;
}


camera_head.h代码如下:

#ifndef __RKCAMSYS_HEAR_H__
#define __RKCAMSYS_HEAR_H__

#include <linux/ioctl.h>

/*
*               C A M S Y S   H E A D   F I L E   V E R S I O N
*
*v0.0.1:
*        1) test version;
*v0.0.2:
*        1) modify camsys_irqcnnt_t;
*v0.0.3:
*        1) add support cif phy for marvin;
*v0.0.4:
*        1) add clock information in struct camsys_devio_name_s;
*v0.0.5:
*        1) add pwren control
*v0.6.0:
*        1) add support mipi phy configuration;
*        2) add support io domain and mclk driver strength configuration;
*v0.7.0:
1) add flash_trigger_out control
*v0.8.0:
1) support isp iommu
*v0.9.0:
1) add dev_name in struct camsys_devio_name_s;
*v0.a.0:
1) support external flash IC
*v0.b.0:
1) add CamSys_SensorBit0_CifBit4 in enum camsys_cifio_e.
2) support sensor powerup sequence configurable.
*/
#define CAMSYS_HEAD_VERSION           KERNEL_VERSION(0,0xb,0)

#define CAMSYS_MARVIN_DEVNAME         "camsys_marvin"
#define CAMSYS_CIF0_DEVNAME           "camsys_cif0"
#define CAMSYS_CIF1_DEVNAME           "camsys_cif1"

#define CAMSYS_NAME_LEN               32

#define CAMSYS_DEVID_MARVIN           0x00000001
#define CAMSYS_DEVID_CIF_0            0x00000002
#define CAMSYS_DEVID_CIF_1            0x00000004
#define CAMSYS_DEVID_INTERNAL         0x000000FF

#define CAMSYS_DEVID_SENSOR_1A        0x01000000
#define CAMSYS_DEVID_SENSOR_1B        0x02000000
#define CAMSYS_DEVID_SENSOR_2         0x04000000
#define CAMSYS_DEVID_EXTERNAL         0xFF000000
#define CAMSYS_DEVID_EXTERNAL_NUM     8

#define CAMSYS_DEVCFG_FLASHLIGHT      0x00000001
#define CAMSYS_DEVCFG_PREFLASHLIGHT   0x00000002
#define CAMSYS_DEVCFG_SHUTTER         0x00000004

//Sensor power up sequence define
//type: bit0-bit4
#define SENSOR_PWRSEQ_BEGIN         0x00
#define SENSOR_PWRSEQ_AVDD          0x01
#define SENSOR_PWRSEQ_DOVDD         0x02
#define SENSOR_PWRSEQ_DVDD          0x03
#define SENSOR_PWRSEQ_CLKIN         0x04
#define SENSOR_PWRSEQ_PWR           0x05
#define SENSOR_PWRSEQ_RST             0x06
#define SENSOR_PWRSEQ_PWRDN         0x07
#define SENSOR_PWRSEQ_END           0x0F
#define SENSOR_PWRSEQ_CNT           0x07

#define VCM_PWRSEQ_BEGIN             0x00
#define VCM_PWRSEQ_VDD                 0x01
#define VCM_PWRSEQ_PWR                 0x02
#define VCM_PWRSEQ_PWRDN               0x03
#define VCM_PWRSEQ_END                 0x0F
#define VCM_PWRSEQ_CNT               0x03

#define POWERSEQ_SET(type,idx)         (type<<(idx*4))
#define POWERSEQ_GET(seq,idx)         ((seq>>(idx*4))&0x0f)

typedef struct camsys_irqsta_s {
unsigned int ris;                 //Raw interrupt status
unsigned int mis;                 //Masked interrupt status
} camsys_irqsta_t;

typedef struct camsys_irqcnnt_s {
int          pid;
unsigned int timeout;             //us

unsigned int mis;
unsigned int icr;
} camsys_irqcnnt_t;

typedef enum camsys_mmap_type_e {     //this type can be filled in mmap offset argument
CamSys_Mmap_RegisterMem,
CamSys_Mmap_I2cMem,

CamSys_Mmap_End
} camsys_mmap_type_t;

typedef struct camsys_querymem_s {
camsys_mmap_type_t      mem_type;
unsigned long           mem_offset;

unsigned int            mem_size;
} camsys_querymem_t;

typedef struct camsys_i2c_info_s {
unsigned char     bus_num;
unsigned short    slave_addr;
unsigned int      reg_addr;       //i2c device register address
unsigned int      reg_size;       //register address size
unsigned int      val;
unsigned int      val_size;       //register value size
unsigned int      i2cbuf_directly;
unsigned int      i2cbuf_bytes;
unsigned int      speed;          //100000 == 100KHz
} camsys_i2c_info_t;

typedef struct camsys_reginfo_s {
unsigned int      dev_mask;
unsigned int      reg_offset;
unsigned int      val;
} camsys_reginfo_t;

typedef enum camsys_sysctrl_ops_e {

CamSys_Vdd_Start_Tag,
CamSys_Avdd,
CamSys_Dovdd,
CamSys_Dvdd,
CamSys_Afvdd,
CamSys_Vdd_End_Tag,

CamSys_Gpio_Start_Tag,
CamSys_PwrDn,
CamSys_Rst,
CamSys_AfPwr,
CamSys_AfPwrDn,
CamSys_PwrEn,
CamSys_Gpio_End_Tag,

CamSys_Clk_Start_Tag,
CamSys_ClkIn,
CamSys_Clk_End_Tag,

CamSys_Phy_Start_Tag,
CamSys_Phy,
CamSys_Phy_End_Tag,
CamSys_Flash_Trigger_Start_Tag,
CamSys_Flash_Trigger,
CamSys_Flash_Trigger_End_Tag,
CamSys_IOMMU

} camsys_sysctrl_ops_t;

typedef struct camsys_regulator_info_s {
unsigned char     name[CAMSYS_NAME_LEN];
int               min_uv;
int               max_uv;
} camsys_regulator_info_t;

typedef struct camsys_gpio_info_s {
unsigned char     name[CAMSYS_NAME_LEN];
unsigned int      active;
} camsys_gpio_info_t;

typedef struct camsys_iommu_s{
int client_fd;
int map_fd;
unsigned long linear_addr;
unsigned long len;
}camsys_iommu_t;

typedef struct camsys_sysctrl_s {
unsigned int              dev_mask;
camsys_sysctrl_ops_t      ops;
unsigned int              on;

unsigned int              rev[20];
} camsys_sysctrl_t;

typedef struct camsys_flash_info_s {
unsigned char     fl_drv_name[CAMSYS_NAME_LEN];
camsys_gpio_info_t        fl; //fl_trig
camsys_gpio_info_t        fl_en;
} camsys_flash_info_t;

typedef struct camsys_mipiphy_s {
unsigned int                data_en_bit;        // data lane enable bit;
unsigned int                bit_rate;           // Mbps/lane
unsigned int                phy_index;          // phy0,phy1
} camsys_mipiphy_t;

typedef enum camsys_fmt_e {
CamSys_Fmt_Yuv420_8b = 0x18,
CamSys_Fmt_Yuv420_10b = 0x19,
CamSys_Fmt_LegacyYuv420_8b = 0x19,

CamSys_Fmt_Yuv422_8b = 0x1e,
CamSys_Fmt_Yuv422_10b = 0x1f,

CamSys_Fmt_Raw_6b = 0x28,
CamSys_Fmt_Raw_7b = 0x29,
CamSys_Fmt_Raw_8b = 0x2a,
CamSys_Fmt_Raw_10b = 0x2b,
CamSys_Fmt_Raw_12b = 0x2c,
CamSys_Fmt_Raw_14b = 0x2d,
} camsys_fmt_t;

typedef enum camsys_cifio_e {
CamSys_SensorBit0_CifBit0 = 0x00,
CamSys_SensorBit0_CifBit2 = 0x01,
CamSys_SensorBit0_CifBit4 = 0x02,
} camsys_cifio_t;

typedef struct camsys_cifphy_s {
unsigned int                cif_num;
camsys_fmt_t                fmt;
camsys_cifio_t              cifio;

} camsys_cifphy_t;

typedef enum camsys_phy_type_e {
CamSys_Phy_Mipi,
CamSys_Phy_Cif,

CamSys_Phy_end
} camsys_phy_type_t;

typedef struct camsys_extdev_phy_s {
camsys_phy_type_t           type;
union {
camsys_mipiphy_t            mipi;
camsys_cifphy_t             cif;
} info;

} camsys_extdev_phy_t;

typedef struct camsys_extdev_clk_s {
unsigned int in_rate;
unsigned int driver_strength;             //0 - 3
} camsys_extdev_clk_t;

typedef struct camsys_devio_name_s {
unsigned char               dev_name[CAMSYS_NAME_LEN];
unsigned int                dev_id;

camsys_regulator_info_t     avdd;         // sensor avdd power regulator name
camsys_regulator_info_t     dovdd;        // sensor dovdd power regulator name
camsys_regulator_info_t     dvdd;         // sensor dvdd power regulator name    "NC" describe no regulator
camsys_regulator_info_t     afvdd;

camsys_gpio_info_t          pwrdn;        // standby gpio name
camsys_gpio_info_t          rst;          // hard reset gpio name
camsys_gpio_info_t          afpwr;        // auto focus vcm driver ic power gpio name
camsys_gpio_info_t          afpwrdn;      // auto focus vcm driver ic standby gpio
camsys_gpio_info_t          pwren;        // power enable gpio name

camsys_flash_info_t         fl;

camsys_extdev_phy_t         phy;
camsys_extdev_clk_t         clk;

unsigned int                dev_cfg;     // function bit mask configuration
} camsys_devio_name_t;

typedef struct camsys_version_s {
unsigned int drv_ver;
unsigned int head_ver;
} camsys_version_t;

/*
*    I O C T L   C O D E S   F O R    R O C K C H I P S   C A M S Y S   D E V I C E S
*
*/
#define HAL_DEVID_EXTERNAL  CAMSYS_DEVID_EXTERNAL  //!< just external devices included
#define CAMSYS_IOC_MAGIC  'M'
#define CAMSYS_IOC_MAXNR  14

#define CAMSYS_VERCHK            _IOR(CAMSYS_IOC_MAGIC,  0, camsys_version_t)

#define CAMSYS_I2CRD             _IOWR(CAMSYS_IOC_MAGIC,  1, camsys_i2c_info_t)
#define CAMSYS_I2CWR             _IOW(CAMSYS_IOC_MAGIC,  2, camsys_i2c_info_t)

#define CAMSYS_SYSCTRL           _IOW(CAMSYS_IOC_MAGIC,  3, camsys_sysctrl_t)
#define CAMSYS_REGRD             _IOWR(CAMSYS_IOC_MAGIC,  4, camsys_reginfo_t)
#define CAMSYS_REGWR             _IOW(CAMSYS_IOC_MAGIC,  5, camsys_reginfo_t)
#define CAMSYS_REGISTER_DEVIO    _IOW(CAMSYS_IOC_MAGIC,  6, camsys_devio_name_t)
#define CAMSYS_DEREGISTER_DEVIO  _IOW(CAMSYS_IOC_MAGIC,  7, unsigned int)
#define CAMSYS_IRQCONNECT        _IOW(CAMSYS_IOC_MAGIC,  8, camsys_irqcnnt_t)
#define CAMSYS_IRQWAIT           _IOR(CAMSYS_IOC_MAGIC,  9, camsys_irqsta_t)
#define CAMSYS_IRQDISCONNECT     _IOW(CAMSYS_IOC_MAGIC,   10, camsys_irqcnnt_t)

#define CAMSYS_QUREYMEM          _IOR(CAMSYS_IOC_MAGIC,  11, camsys_querymem_t)
#define CAMSYS_QUREYIOMMU        _IOW(CAMSYS_IOC_MAGIC,  12, int)
#endif


Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := camera

LOCAL_SRC_FILES := camera.cpp

include $(BUILD_EXECUTABLE)


三、实现结果:已经成果获取对应寄存器的地址的内容

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: