您的位置:首页
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
camera_head.h代码如下:
Android.mk如下:
三、实现结果:已经成果获取对应寄存器的地址的内容
内核: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)
三、实现结果:已经成果获取对应寄存器的地址的内容
相关文章推荐
- rk3288获取唯一性ID方法
- 关于GPL329A中获取摄像头sensor id的问题
- 关于GPL329A中获取摄像头sensor id的问题
- 原创:微信小程序java实现AES解密并获取unionId
- [RK3288][Android6.0] 系统中UID(用户ID)知识点小结
- [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点
- RK3288 Android4.4 获取 root权限
- 【原创】jQuery获取div的id值
- rk3188/3288 android 5.x UsbDevice 获取 UsbInterface问题
- RK3288 UVC 摄像头调试
- [RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结
- [RK3288][Android6.0] WiFi之DHCP获取IP address流程
- .Nettiers的事件:下拉控件数据绑定,Insert,调用自定存储过程,获取新增ID,事务,DeepLoad,DeepSave,Save,Update,DeepDelete【原创】
- 原创:微信小程序java实现AES解密并获取unionId
- [RK3288][Android6.0] WiFi之从Linkspeed看获取流程
- 原创:微信小程序java实现AES解密并获取unionId
- RK3288 uvc摄像头调试
- 原创:微信小程序java实现AES解密并获取unionId
- yii2框架获取刚插入数据库的id (原创)