ioctl(fd, VIDIOC_QBUF 返回 -1 处理
r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z
r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z 开发板:CB-S 1、(可选修改/调试技巧:) 除了ov5640.c之外,其它的驱动都不编译,节省编译时间! W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\device\Makefile obj-m += ov5640.o #obj-m += ov2640.o #obj-m += ov7736.o #obj-m += s5k4ec.o #obj-m += s5k4ec_mipi.o #obj-m += gc2035.o #obj-m += gt2005.o #obj-m += gc0307.o #obj-m += gc0308.o #obj-m += gc0328.o #obj-m += gc0328c.o #obj-m += gc2145.o #obj-m += gc0329.o #obj-m += gc0311.o #obj-m += hi253.o #obj-m += sp2518.o #obj-m += sp2519.o #obj-m += sp0718.o #obj-m += sp0838.o #obj-m += ov16825.o #obj-m += ov5650.o #obj-m += ov5647.o #obj-m += ov5647_mipi.o #obj-m += t8et5.o #obj-m += s5k4e1.o #obj-m += s5k4e1_mipi.o #obj-m += sp2518.o #obj-m += sp0718.o #obj-m += gc5004.o #obj-m += gc5004_mipi.o #obj-m += ov5648.o #obj-m += ar0330.o #obj-m += ov5648.o #obj-m += sp5408.o #obj-m += ov12830.o #obj-m += ov8825.o #obj-m += ov8850.o #obj-m += gc2155.o #obj-m += ov8858.o #obj-m += ov13850.o #obj-m += imx214.o #obj-m += ov8858_4lane.o #obj-m += sp5409.o #obj-m += s5k5e2yx.o #obj-m += ov2710_mipi.o #obj-m += ov2686.o (这里是看ov5640的驱动的probe执行是否正确?设备ID是否读取成功!) W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\device\ov5640.c static int sensor_detect(struct v4l2_subdev *sd) { data_type rdval; printk("****wyb %s:%d/%s()! \n", __FILE__, __LINE__, __func__); LOG_ERR_RET(sensor_read(sd, 0x300a, &rdval;)) printk("****wyb %s:%d/%s()! 0x300a rdval=0xx\n", __FILE__, __LINE__, __func__, rdval); if(rdval != 0x56) return -ENODEV; LOG_ERR_RET(sensor_read(sd, 0x300b, &rdval;)) printk("****wyb %s:%d/%s()! 0x300b rdval=0xx\n", __FILE__, __LINE__, __func__, rdval); if(rdval != 0x40) return -ENODEV; return 0; } (在全志R16平台改过这个文件,让摄像头不要休眠,但是全志R40平台的tina v2.1系统下不需要修改!) W:\ov5640_spi20_r40t\lichee\linux-3.10\drivers\media\platform\sunxi-vfe\vfe.c 2、(可选修改/根据和全志R16平台的tina v1.0的系统下的SDK对照发现的问题。全志R16的最新的tina v2.1大幅度修改cameratest的源代码了!) W:\ov5640_spi20_r40t\package\allwinner\cameratest\src\common\hawkview.c int fetch_sub_cmd(const char* buf,int buf_len,char** cmd,int* cmd_num,int lenght) { int i = 0,j = 0,n = 0; while(buf[i] != '#'){ //the sub cmd end by '#' while(buf[i] != 'x' && buf[i] != ':' && buf[i] != '#') { if(i++ > buf_len) return 0; *((char*)cmd + n*lenght + j++) = buf[i]; if(j > lenght) { hv_err("sub cmd over long\n"); *cmd_num = n + 1; return -1; } } *((char*)cmd + n*lenght + j++) = '\0'; n++; j = 0; if(buf[i] != '#'){ i++; } if(n > *cmd_num){ hv_err("the max cmd num is %d\n",*cmd_num); return -1; } } *cmd_num = n; return 0; } 修改为: int fetch_sub_cmd(const char* buf,int buf_len,char** cmd,int* cmd_num,int lenght) { int i = 0,j = 0,n = 0; while(buf[i] != '#'){ //the sub cmd end by '#' while(buf[i] != 'x' && buf[i] != ':' && buf[i] != '#') { if((i+1) > buf_len) return 0; *((char*)cmd + n*lenght + j++) = buf[i++]; if(j > lenght) { hv_err("sub cmd over long\n"); *cmd_num = n + 1; return -1; } } *((char*)cmd + n*lenght + j++) = '\0'; n++; j = 0; if(buf[i] != '#'){ i++; } if(n > *cmd_num){ hv_err("the max cmd num is %d\n",*cmd_num); return -1; } } *cmd_num = n; return 0; } W:\ov5640_spi20_r40t\package\allwinner\cameratest\src\common\video.c static int capture_frame(void* capture,int (*set_disp_addr)(int,int,unsigned int*),pthread_mutex_t* mutex) { capture_handle* cap = (capture_handle*)capture; int ret; int i; struct v4l2_buffer buf; enum v4l2_buf_type type; fd_set fds; struct timeval tv; pthread_mutex_lock(mutex); //used for cammand and status debug if (old_vi_cmd != cap->cmd){ hv_dbg("capture frame command %d --> %d\n",old_vi_cmd,cap->cmd); old_vi_cmd = (int)cap->cmd; } if(old_status != cap->status){ hv_dbg("capture frame status %d --> %d\n",old_status,cap->status); old_status = cap->status; } if(cap->status == OFF && cap->cmd == START_STREAMMING){ hv_dbg("capture start streaming\n"); type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (ioctl(videofh, VIDIOC_STREAMON, &type;) == -1) { hv_err("VIDIOC_STREAMON error! %s\n",strerror(errno)); goto quit; } cap->status = ON; cap->cmd = COMMAND_UNUSED; pthread_mutex_unlock(mutex); return 0; } if(cap->status == ON && cap->cmd == STOP_STREAMMING){ hv_dbg("capture stop streaming\n"); type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if(-1 == ioctl(videofh, VIDIOC_STREAMOFF, &type;)){ hv_err("VIDIOC_STREAMOFF error! %s\n",strerror(errno)); goto quit; } cap->status = OFF; cap->cmd = COMMAND_UNUSED; capture_quit(capture); pthread_mutex_unlock(mutex); return 2; } if(cap->status == OFF) { pthread_mutex_unlock(mutex); return 0; } FD_ZERO(&fds;); FD_SET(videofh, &fds;); tv.tv_sec = 2; tv.tv_usec = 0; pthread_mutex_unlock(mutex); ret = select(videofh + 1, &fds;, NULL, NULL, &tv;); pthread_mutex_lock(mutex); //hv_dbg("select video ret: %d\n",ret); if (ret == -1) { if (errno == EINTR) { return 0; } hv_err("select error\n"); goto stream_off; } else if (ret == 0) { hv_err("select timeout\n"); pthread_mutex_unlock(mutex); return 0; } memset(&buf;, 0, sizeof(struct v4l2_buffer)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; ret = ioctl(videofh, VIDIOC_DQBUF, &buf;); if (ret == -1) { hv_err("VIDIOC_DQBUF failed!\n"); goto stream_off; } float framerate; framerate = get_framerate((long long)(buf.timestamp.tv_sec),(long long)(buf.timestamp.tv_usec)); if(framerate > 1.0){ cap->cap_fps = framerate; //hv_dbg("framerate: %0.2ffps\n",cap->cap_fps); } //sync capture info perp x second #define M_SECOND 200 if(is_x_msec(M_SECOND,(long long)(buf.timestamp.tv_sec),(long long)(buf.timestamp.tv_usec))){ getExifInfo(&(cap->frame.exif)); // set_cap_info((void*)cap); } if(cap->cmd == STOP_SAVE_FRAME && cap->save_status == ON) cap->save_status = OFF; //save frame , the frame will be get by PC Tool to preview on PC screen //frame format: /dev/frame_x (x:0~21) if(cap->cmd == SAVE_FRAME || cap->save_status == ON ) { if(cap->cmd == SAVE_FRAME){ cap->save_status = ON; cap->cmd = COMMAND_UNUSED; } ret = do_save_frame(capture,buf.index); } //take yuv image,it will save the target frame exif info in the same time //image name: xxxx (set by usered through command) //exif info name: xxxx.exif if(cap->cmd == SAVE_IMAGE ) { ret = 0;//getExifInfo(&(cap->picture.exif)); //get target frame exif info successfully then save the target image //if get the exif info fail,it will try next frame if(ret == 0){ buffers[buf.index].phy_addr = buf.m.offset - 0x20000000; hv_dbg("index: %d buffers[buf.index].start = %p\n",buf.index,buffers[buf.index].start); //do_save_image(capture,buf.index); do_save_sub_image(capture,buf.index); cap->cmd = COMMAND_UNUSED; } } //get display addr int w,h; unsigned int addr; get_disp_addr(capture, buf.m.offset,&addr;,&w,&h); // set disp buffer if (set_disp_addr){ set_disp_addr(w,h,&addr;); } ret = ioctl(videofh, VIDIOC_QBUF, &buf;); if (ret == -1) { hv_err("VIDIOC_DQBUF failed!\n"); goto stream_off; } pthread_mutex_unlock(mutex); return 0; stream_off: hv_err("err stream off\n"); ioctl(videofh, VIDIOC_STREAMOFF, &type;); quit: capture_quit(capture); pthread_mutex_unlock(mutex); return -1; } W:\ov5640_spi20_r40t\package\allwinner\cameratest\src\common\video_helper.c int set_cap_info(void* capture) { char info[500]; char exif[500]; char file_path[20]; capture_handle* cap = (capture_handle*)capture; memset(info,0,sizeof(info)); //strcpy(file_path, "dev/info"); sprintf(file_path, "%s/%s.info", PATH, cap->picture.path_name); //sync string: sensor_type:save_status:framrate:capture_w:capture_h,sub_w,sub_h# sprintf(info, \ "sensor_type = %s\n" \ "status = %d\n" \ "framerate = %0.2f\n" \ "subchanel_width = %d\n" \ "subchanel_height = %d\n" \ "rotation = %d\n\n", \ (cap->sensor_type == 1)?"raw":"yuv", \ cap->save_status, \ cap->cap_fps, \ cap->sub_w, \ cap->sub_h, \ cap->sub_rot); make_exif_info(exif,"none",&(cap->frame.exif),cap->cap_w,cap->cap_h); strcat(info,exif); //hv_dbg("info str:\n%s\n",info); return write_file(file_path,info,sizeof(info)); } int do_save_sub_image(void* capture,int buf_index) { int ret; char image_name[30]; capture_handle* cap = (capture_handle*)capture; memset(image_name,0,sizeof(image_name)); sprintf(image_name,"%s/%s", PATH,cap->picture.path_name); hv_dbg("image_name: %s\n",image_name); set_cap_info(capture); set_exif_info(capture); hv_dbg("--------set_exif_info end\n"); void* vir_sub_start = NULL; unsigned int phy_sub_start = 0; int w,h; if(cap->sensor_type == V4L2_SENSOR_TYPE_RAW){ vir_sub_start = (unsigned int)(buffers[buf_index].start) + ALIGN_4K(ALIGN_16B(cap->cap_w) * cap->cap_h * 3 >> 1); phy_sub_start = buffers[buf_index].phy_addr + ALIGN_4K(ALIGN_16B(cap->cap_w) * cap->cap_h * 3 >> 1); w = cap->sub_w; h = cap->sub_h; } else { vir_sub_start = buffers[buf_index].start; phy_sub_start = buffers[buf_index].phy_addr; w = cap->cap_w; h = cap->cap_h; } #ifdef ANDROID_ENV ret = save_jpeg_frame(image_name,phy_sub_start,w,h); //sprintf(image_name,"/data/camera/yuv%s", cap->picture.path_name); //ret = save_jpeg_frame_by_viraddr(image_name,(void*)vir_sub_start,cap->sub_w,cap->sub_h); #else sprintf(image_name,"%s/yuv%s", PATH,cap->picture.path_name); ret = save_frame_to_file(image_name, \ (void*)(vir_sub_start), \ w,h,cap->cap_fmt, \ 1); #endif if(ret == -1) hv_err("save image failed!\n"); return 0; } 3、修改ov5640的供电(强制供电),但是这样(简单粗暴的)修改肯定会影响其它模块(以太网卡找不到了^_)! W:\ov5640_spi20_r40t\target\allwinner\azalea-m2ultra\configs\sys_config.fex ;---------------------------------------------------------------------------------- ; ; 各路电压输出语法说明: ; ; 电压名称 = 100XXXX : 表示把该路电压设置为XXXX指定的电压值,同时打开输出开关 ; 电压名称 = 000XXXX : 表示把该路电压设置为XXXX指定的电压值,同时关闭输出开关,当有需要时由内核驱动打开 ; 电压名称 = 0 : 表示关闭该路电压输出开关,不修改原有的值 ; ;---------------------------------------------------------------------------------- [power_sply] dcdc1_vol = 1003300 dcdc2_vol = 1001160 dcdc3_vol = 1001100 dcdc4_vol = 1100 aldo1_vol = 2800 aldo2_vol = 2500 aldo3_vol = 1003000 dc1sw_vol = 3300 dc5ldo_vol = 1100 dldo1_vol = 3300 dldo2_vol = 3300 dldo3_vol = 3300 dldo4_vol = 2500 ;eldo1_vol = 2800 eldo1_vol = 1002800 ;eldo2_vol = 1500 eldo2_vol = 1001500 ;eldo3_vol = 1200 eldo3_vol = 1002800 gpio0_vol = 3300 gpio1_vol = 1800 [twi4] twi4_used = 1 twi4_scl = port:PI02<3><default><default><default> twi4_sda = port:PI03<3><default><default><default> ;-------------------------------------------------------------------------------- ;csi (COMS Sensor Interface) configuration ;csi(x)_dev(x)_used: 0:disable 1:enable ;csi(x)_dev(x)_isp_used 0:not use isp 1:use isp ;csi(x)_dev(x)_fmt: 0:yuv 1:bayer raw rgb ;csi(x)_dev(x)_stby_mode: 0:not shut down power at standby 1:shut down power at standby ;csi(x)_dev(x)_vflip: flip in vertical direction 0:disable 1:enable ;csi(x)_dev(x)_hflip: flip in horizontal direction 0:disable 1:enable ;csi(x)_dev(x)_iovdd: camera module io power handle string, pmu power supply ;csi(x)_dev(x)_iovdd_vol: camera module io power voltage, pmu power supply ;csi(x)_dev(x)_avdd: camera module analog power handle string, pmu power supply ;csi(x)_dev(x)_avdd_vol: camera module analog power voltage, pmu power supply ;csi(x)_dev(x)_dvdd: camera module core power handle string, pmu power supply ;csi(x)_dev(x)_dvdd_vol: camera module core power voltage, pmu power supply ;csi(x)_dev(x)_afvdd: camera module vcm power handle string, pmu power supply ;csi(x)_dev(x)_afvdd_vol: camera module vcm power voltage, pmu power supply ;fill voltage in uV, e.g. iovdd = 2.8V, csix_iovdd_vol = 2800000 ;fill handle string as below: ;axp22_eldo3 ;axp22_dldo4 ;axp22_eldo2 ;fill handle string "" when not using any pmu power supply ;-------------------------------------------------------------------------------- [csi0] csi0_used = 1 csi0_sensor_list = 0 csi0_pck = port:PE00<3><default><default><default> csi0_mck = port:PE01<1><0><1><0> csi0_hsync = port:PE02<3><default><default><default> csi0_vsync = port:PE03<3><default><default><default> csi0_d0 = port:PE04<3><default><default><default> csi0_d1 = port:PE05<3><default><default><default> csi0_d2 = port:PE06<3><default><default><default> csi0_d3 = port:PE07<3><default><default><default> csi0_d4 = port:PE08<3><default><default><default> csi0_d5 = port:PE09<3><default><default><default> csi0_d6 = port:PE10<3><default><default><default> csi0_d7 = port:PE11<3><default><default><default> [csi0/csi0_dev0] csi0_dev0_used = 1 csi0_dev0_mname = "ov5640" csi0_dev0_twi_addr = 0x78 csi0_dev0_twi_id = 4 csi0_dev0_pos = "rear" csi0_dev0_isp_used = 0 csi0_dev0_fmt = 0 csi0_dev0_stby_mode = 0 csi0_dev0_vflip = 0 csi0_dev0_hflip = 0 ;csi0_dev0_iovdd = "csi-iovcc" csi0_dev0_iovdd = "" csi0_dev0_iovdd_vol = 2800000 ;csi0_dev0_avdd = "csi-avdd" csi0_dev0_avdd = "" csi0_dev0_avdd_vol = 2800000 ;csi0_dev0_dvdd = "csi-dvdd" csi0_dev0_dvdd = "" csi0_dev0_dvdd_vol = 1500000 ;csi0_dev0_afvdd = "csi-afvcc" csi0_dev0_afvdd = "" csi0_dev0_afvdd_vol = 2800000 csi0_dev0_power_en = csi0_dev0_reset = port:PI07<1><0><1><0> csi0_dev0_pwdn = port:PI06<1><0><1><0> csi0_dev0_flash_used = 0 csi0_dev0_flash_type = 2 csi0_dev0_flash_en = csi0_dev0_flash_mode = csi0_dev0_flvdd = "" csi0_dev0_flvdd_vol = csi0_dev0_af_pwdn = csi0_dev0_act_used = 0 csi0_dev0_act_name = "ad5820_act" csi0_dev0_act_slave = 0x18 [csi1] csi1_used = 0 csi1_sensor_list = 0 csi1_pck = port:PG00<3><default><default><default> csi1_mck = port:PG01<1><0><1><0> csi1_hsync = port:PG02<3><default><default><default> csi1_vsync = port:PG03<3><default><default><default> csi1_d0 = port:PG04<3><default><default><default> csi1_d1 = port:PG05<3><default><default><default> csi1_d2 = port:PG06<3><default><default><default> csi1_d3 = port:PG07<3><default><default><default> csi1_d4 = port:PG08<3><default><default><default> csi1_d5 = port:PG09<3><default><default><default> csi1_d6 = port:PG10<3><default><default><default> csi1_d7 = port:PG11<3><default><default><default> [csi1/csi1_dev0] csi1_dev0_used = 0 csi1_dev0_mname = "ov5640" csi1_dev0_twi_addr = 0x78 csi1_dev0_twi_id = 1 csi1_dev0_pos = "rear" csi1_dev0_isp_used = 0 csi1_dev0_fmt = 0 csi1_dev0_stby_mode = 0 csi1_dev0_vflip = 0 csi1_dev0_hflip = 0 csi1_dev0_iovdd = "" csi1_dev0_iovdd_vol = 2800000 csi1_dev0_avdd = "" csi1_dev0_avdd_vol = 2800000 csi1_dev0_dvdd = "" csi1_dev0_dvdd_vol = 1500000 csi1_dev0_afvdd = "" csi1_dev0_afvdd_vol = 2800000 csi1_dev0_power_en = csi1_dev0_reset = port:PH14<1><0><1><0> csi1_dev0_pwdn = port:PH17<1><0><1><0> csi1_dev0_flash_used = 0 csi1_dev0_flash_type = 2 csi1_dev0_flash_en = csi1_dev0_flash_mode = csi1_dev0_flvdd = "" csi1_dev0_flvdd_vol = csi1_dev0_af_pwdn = csi1_dev0_act_used = 0 csi1_dev0_act_name = "ad5820_act" csi1_dev0_act_slave = 0x18 ;-------------------------------------------------------------------------------------------------------- ;compatible ---regulator0 name, support:axp221s-regulator ;regulator_count ---pmu ldo count, changed with different pmu ;regulator(1~regulator_count) ---ldo details ;-------------------------------------------------------------------------------------------------------- [regulator0] compatible = "axp221s-regulator" regulator_count = 20 regulator1 = "axp221s_dcdc1 none vcc-hdmi vcc-io vcc-dsi vcc-usb vdd-efuse vcc-hp vcc-audio vcc-emmc vcc-card vcc-pc vcc-pd vcc-3v vcc-tvout vcc-tvin vcc-emmcv vcc-sdcv vcc-sdcvq33 vcc-sdcvd vcc-nand vcc-sdcv-p3 vcc-sdcvq33-p3 vcc-sdcvd-p3" regulator2 = "axp221s_dcdc2 none vdd-cpua" regulator3 = "axp221s_dcdc3 none vdd-sys vdd-gpu" regulator4 = "axp221s_dcdc4 none" regulator5 = "axp221s_dcdc5 none vcc-dram" regulator6 = "axp221s_rtc none vcc-rtc" regulator7 = "axp221s_aldo1 none vcc-25 csi-avdd" regulator8 = "axp221s_aldo2 none vcc-ephy0" regulator9 = "axp221s_aldo3 none avcc vcc-pll" regulator10 = "axp221s_dldo1 none vcc-io-wifi vcc-pg " regulator11 = "axp221s_dldo2 none vcc-wifi1" regulator12 = "axp221s_dldo3 none vcc-wifi2" regulator13 = "axp221s_dldo4 none vdd-sata-25 vcc-pf" regulator14 = "axp221s_eldo1 none vcc-pe csi-iovcc csi-afvcc" regulator15 = "axp221s_eldo2 none csi-dvdd" regulator16 = "axp221s_eldo3 none vdd-sata-12" regulator17 = "axp221s_ldoio0 none vcc-ctp" regulator18 = "axp221s_ldoio1 none vcc-i2s-18" regulator19 = "axp221s_dc1sw none ephy0-dvdd" regulator20 = "axp221s_dc5ldo none" (电源设备树的修改) ;-------------------------------------------------------------------------------------------------------- ;compatible ---regulator0 name, support:axp221s-regulator ;regulator_count ---pmu ldo count, changed with different pmu ;regulator(1~regulator_count) ---ldo details ;-------------------------------------------------------------------------------------------------------- [regulator0] compatible = "axp221s-regulator" regulator_count = 20 regulator1 = "axp221s_dcdc1 none vcc-hdmi vcc-io vcc-dsi vcc-usb vdd-efuse vcc-hp vcc-audio vcc-emmc vcc-card vcc-pc vcc-pd vcc-3v vcc-tvout vcc-tvin vcc-emmcv vcc-sdcv vcc-sdcvq33 vcc-sdcvd vcc-nand vcc-sdcv-p3 vcc-sdcvq33-p3 vcc-sdcvd-p3" regulator2 = "axp221s_dcdc2 none vdd-cpua" regulator3 = "axp221s_dcdc3 none vdd-sys vdd-gpu" regulator4 = "axp221s_dcdc4 none" regulator5 = "axp221s_dcdc5 none vcc-dram" regulator6 = "axp221s_rtc none vcc-rtc" regulator7 = "axp221s_aldo1 none" regulator8 = "axp221s_aldo2 none vcc-ephy0" regulator9 = "axp221s_aldo3 none avcc vcc-pll" regulator10 = "axp221s_dldo1 none vcc-io-wifi vcc-pg " regulator11 = "axp221s_dldo2 none vcc-wifi1" regulator12 = "axp221s_dldo3 none vcc-wifi2" regulator13 = "axp221s_dldo4 none vdd-sata-25 vcc-pf" regulator14 = "axp221s_eldo1 none" regulator15 = "axp221s_eldo2 none" regulator16 = "axp221s_eldo3 none" regulator17 = "axp221s_ldoio0 none vcc-ctp" regulator18 = "axp221s_ldoio1 none vcc-i2s-18" regulator19 = "axp221s_dc1sw none ephy0-dvdd" regulator20 = "axp221s_dc5ldo none" 4、(为了调试方便,可选修改:) W:\ov5640_spi20_r40t\target\allwinner\generic\configs\env-3.10.cfg #kernel command arguments enforcing=1 earlyprintk=sunxi-uart,0x01c28000 initcall_debug=0 console=ttyS0,115200 nor_root=/dev/mtdblock4 nand_root=/dev/nandd mmc_root=/dev/mmcblk0p7 init=/sbin/init loglevel=8 cma=256M #set kernel cmdline if boot.img or recovery.img has no cmdline we will use this setargs_nor=setenv bootargs enforcing=${enforcing} earlyprintk=${earlyprintk} initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${nor_root} rootwait init=${init} partitions=${partitions} cma=${cma} setargs_nand=setenv bootargs enforcing=${enforcing} earlyprintk=${earlyprintk} initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${nand_root} rootwait init=${init} partitions=${partitions} cma=${cma} setargs_mmc=setenv bootargs enforcing=${enforcing} earlyprintk=${earlyprintk} initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${mmc_root} rootwait init=${init} partitions=${partitions} cma=${cma} boot_normal=fatload sunxi_flash boot 43800000 uImage;bootm 43800000 boot_recovery=fatload sunxi_flash recovery 43800000 uImage;bootm 43800000 boot_fastboot=fastboot #recovery key recovery_key_value_max=0x13 recovery_key_value_min=0x10 #fastboot key fastboot_key_value_max=0x8 fastboot_key_value_min=0x2 #uboot system env config bootdelay=3 #default bootcmd, will change at runtime according to key press bootcmd=run setargs_nand boot_normal#default nand boot 5、打开摄像头的抓图程序cameratest: rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ ll 总用量 96 drwxrwxr-x 4 rootroot rootroot 4096 1月 12 2017 build drwxrwxr-x 3 rootroot rootroot 4096 1月 12 2017 config -r--r--r-- 1 rootroot rootroot 609 1月 12 2017 Config.in drwxrwxr-x 3 rootroot rootroot 24576 1月 12 2017 dl drwxrwxr-x 3 rootroot rootroot 4096 1月 12 2017 docs drwxrwxr-x 4 rootroot rootroot 4096 11月 13 20:57 lichee -r--r--r-- 1 rootroot rootroot 82 1月 12 2017 Makefile drwxrwxr-x 4 rootroot rootroot 4096 11月 14 10:02 out drwxrwxr-x 19 rootroot rootroot 4096 10月 20 20:47 package drwxrwxr-x 4 rootroot rootroot 4096 1月 12 2017 prebuilt -r--r--r-- 1 rootroot rootroot 13360 1月 12 2017 rules.mk drwxrwxr-x 6 rootroot rootroot 4096 1月 12 2017 scripts drwxrwxr-x 7 rootroot rootroot 4096 10月 18 15:53 target drwxrwxr-x 3 rootroot rootroot 4096 11月 14 15:00 tmp drwxrwxr-x 12 rootroot rootroot 4096 1月 12 2017 toolchain drwxrwxr-x 60 rootroot rootroot 4096 1月 12 2017 tools rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ source build/envsetup.sh including target/allwinner/azalea-m2ultra/vendorsetup.sh including target/allwinner/azalea-perf1/vendorsetup.sh including target/allwinner/octopus-dev/vendorsetup.sh including target/allwinner/azalea-evb/vendorsetup.sh including target/allwinner/azalea-perf3/vendorsetup.sh including target/allwinner/octopus-sch/vendorsetup.sh including target/allwinner/nuclear-dev/vendorsetup.sh including target/allwinner/astar-spk/vendorsetup.sh including target/allwinner/tulip-d1/vendorsetup.sh including target/allwinner/azalea-m2ultraservers/vendorsetup.sh including target/allwinner/generic/vendorsetup.sh including target/allwinner/astar-evb/vendorsetup.sh including target/allwinner/astar-parrot/vendorsetup.sh including target/allwinner/azalea-perf2/vendorsetup.sh rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ lunch You're building on Linux Lunch menu... pick a combo: 1. azalea_m2ultra-tina 2. azalea_m2ultra-dragonboard 3. azalea_perf1-tina 4. azalea_perf1-dragonboard 5. octopus_dev-tina 6. octopus_dev-dragonboard 7. azalea_evb-tina 8. azalea_evb-dragonboard 9. azalea_perf3-tina 10. azalea_perf3-dragonboard 11. octopus_sch-tina 12. octopus_sch-dragonboard 13. nuclear_dev-tina 14. nuclear_dev-dragonboard 15. astar_spk-tina 16. astar_spk-dragonboard 17. tulip_d1-tina 18. tulip_d1-dragonboard 19. azalea_m2ultraservers-tina 20. azalea_m2ultraservers-dragonboard 21. astar_evb-tina 22. astar_parrot-tina 23. astar_parrot-dragonboard 24. azalea_perf2-tina 25. azalea_perf2-dragonboard Which would you like?1 ============================================ PLATFORM_VERSION_CODENAME=Neptune PLATFORM_VERSION=2.1.1 PRODUCT_VERSION=v1.0 TARGET_PRODUCT=azalea_m2ultra TARGET_BUILD_VARIANT=tina TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=cortex-a7 TARGET_2ND_ARCH= TARGET_2ND_ARCH_VARIANT= TARGET_2ND_CPU_VARIANT= HOST_ARCH=x86_64 HOST_OS=linux HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty HOST_BUILD_TYPE=release BUILD_ID=5861D22E TARGET_OUT_DIR=out/azalea-m2ultra ============================================ rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ make menuconfig Allwinner ---> < > cameratest.............................. camerateset just test the camera 修改为: <*> cameratest.............................. camerateset just test the camera 6、通过cameratest获取NV12格式的YUV图片: rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ make -j12 rootroot@cm-System-Product-Name:/home/rediron/r40_tinav2.1/spi20_r40_tinav2.1$ pack 打包刷机之后: [ 43.941698] sunxi-mmc sdc1: smc 2 p1 err, cmd 55, RTO !! [ 43.942520] sunxi-mmc sdc1: smc 2 p1 err, cmd 55, RTO !! [ 43.942537] sunxi-mmc sdc1: sdc set ios: clk 400000Hz bm OD pm ON vdd 21 width 1 timing LEGACY(SDR12) dt B [ 43.943388] sunxi-mmc sdc1: smc 2 p1 err, cmd 1, RTO !! [ 43.943405] sunxi-mmc sdc1: sdc set ios: clk 0Hz bm OD pm OFF vdd 0 width 1 timing LEGACY(SDR12) dt B [ 44.046319] dhd_module_init: Failed to load driver max retry reached** [ 44.053573] dhd_module_init: Exit err=-19 BusyBox v1.24.1 () built-in shell (ash) _____ _ __ _ |_ _||_| ___ _ _ | | |_| ___ _ _ _ _ | | _ | || | | |__ | || || | ||_'_| | | | || | || _ | |_____||_||_|_||___||_,_| |_| |_||_|_||_|_| Tina is Based on OpenWrt! ---------------------------------------------- Tina Linux (Neptune, 5861D22E) ---------------------------------------------- root@TinaLinux:/# root@TinaLinux:/# root@TinaLinux:/# root@TinaLinux:/# root@TinaLinux:/# lsmod crc_ccitt 1003 1 ppp_async disp 1024221 1 mali ft5x_ts 56095 0 fuse 59395 0 mali 146657 0 ov5640 23837 0 ppp_async 6125 0 snd_mixer_oss 11447 1 snd_pcm_oss snd_pcm_oss 32590 0 snd_rawmidi 15038 0 snd_seq_device 4206 1 snd_rawmidi uvcvideo 55997 0 vfe_io 24990 3 vfe_v4l2 vfe_v4l2 170636 0 videobuf2_core 20745 2 uvcvideo videobuf2_dma_contig 7462 1 vfe_v4l2 videobuf2_memops 1167 2 videobuf2_vmalloc videobuf2_vmalloc 2260 1 uvcvideo root@TinaLinux:/# root@TinaLinux:/# root@TinaLinux:/# cd /dev root@TinaLinux:/dev# root@TinaLinux:/dev# ll v* crw-r--r-- 1 root root 7, 0 Jan 1 18:38 vcs crw-r--r-- 1 root root 7, 1 Jan 1 18:38 vcs1 crw-r--r-- 1 root root 7, 128 Jan 1 18:38 vcsa crw-r--r-- 1 root root 7, 129 Jan 1 18:38 vcsa1 crw-r--r-- 1 root root 10, 60 Jan 1 18:38 vhci crw-r--r-- 1 root root 81, 0 Jan 1 18:38 video0 root@TinaLinux:/dev# root@TinaLinux:/dev# root@TinaLinux:/dev# cd /bin root@TinaLinux:/bin# root@TinaLinux:/bin# ll c* -rwxr-xr-x 1 root root 16415 Nov 14 2017 cameratest lrwxrwxrwx 1 root root 7 Nov 14 2017 cat -> busybox lrwxrwxrwx 1 root root 7 Nov 14 2017 chgrp -> busybox lrwxrwxrwx 1 root root 7 Nov 14 2017 chmod -> busybox lrwxrwxrwx 1 root root 7 Nov 14 2017 chown -> busybox -rwxrwxr-x 1 root root 7486 Nov 14 2017 config_generate lrwxrwxrwx 1 root root 7 Nov 14 2017 cp -> busybox root@TinaLinux:/bin# root@TinaLinux:/bin# root@TinaLinux:/bin# root@TinaLinux:/bin# cameratest [hawkview_dbg]hawkview_init set_w 1280 [hawkview_msg]----sunxi9iw1p1 capture register sucessfully! [hawkview_dbg]hawkview_init 2 [hawkview_dbg]video pthread_create ret:0 [hawkview_dbg]command pthread_create ret:0 [hawkview_dbg]video thread status 0 --> 101 (在WIN7下通过ADB执行:echo "146:0:1:640x480#" > command) [hawkview_dbg]read cmd [ 367.874915] [VFE]vfe_open 146:0:1:640x480# [hawkview_db[ 367.879364] [VFE]vfe_runtime_resume g]cmd 0: 146 [hawkview_dbg]cmd 1: 0 [hawkview_dbg]cmd 2: 1 [hawkview_dbg]cmd 3: 640 [hawkview_dbg]cmd 4: 480 [hawkview_dbg]send command 146 [hawkview_dbg]video thread cmd: 0 --> 146 [ha[ 367.901274] [VFE]..........................vfe clk open!....................... wkview_dbg]reset video capture [ 367.911823] [VFE]vfe_open ok [hawkview_msg]----open /dev/video0 [hawkview_err]xxxxquery sensor type ctrl failed[hawkview_msg]----get sensor type: 0 [ 368.919222] [VFE_ERR]set input i(1)>dev_qty(1)-1 error! [hawkview_err]xxxxVIDIOC_S_INPUT[ 368.925295] [VFE]Set csi core clk = 324000000, after Set csi core clk = 300000000 failed! s_input: 1 [ 368.949874] [VFE]mclk on [ 369.020884] ****wyb drivers/media/platform/sunxi-vfe/device/ov5640.c:3803/sensor_detect()! [ 369.032713] ****wyb drivers/media/platform/sunxi-vfe/device/ov5640.c:3806/sensor_detect()! 0x300a rdval=0x56 [ 369.045569] ****wyb drivers/media/platform/sunxi-vfe/device/ov5640.c:3812/sensor_detect()! 0x300b rdval=0x40 [ 369.460120] [OV5640]s_fmt set width = 640, height = 480 [ 369.466695] csi->frame_info.frm_byte_size = 460800 [hawkview_msg]----the tried size[ 369.477629] [VFE]queue_setup, buffer count=10, size=460800 is 640x480,the supported size is 640x480! [ 369.487826] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.496813] ion_alloc carveout failed!! [ 369.509617] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.518294] ion_alloc carveout failed!! [ 369.523098] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.531666] ion_alloc carveout failed!! [ 369.544202] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.552807] ion_alloc carveout failed!! [ 369.558855] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.567497] ion_alloc carveout failed!! [ 369.579848] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.588538] ion_alloc carveout failed!! [ 369.594150] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.602709] ion_alloc carveout failed!! [ 369.613211] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.621806] ion_alloc carveout failed!! [ 369.627830] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.636467] ion_alloc carveout failed!! [ 369.645614] cameratest-4367 ion_alloc:522 buffer alloc fail ! heap id 4, len 462848 [ 369.654229] ion_alloc carveout failed!! [hawkview_dbg]map buffer index: 0, mem: b6e2a000, len: 70800, offset: 0 [hawkview_dbg]map buffer index: 1, mem: b6db9000, len: 70800, offset: 71000 [hawkview_dbg]map buffer index: 2, mem: b6d48000, len: 70800, offset: e2000 [hawkview_dbg]map buffer index: 3, mem: b6cd7000, len: 70800, offset: 153000 [hawkview_dbg]map buffer index: 4, mem: b6c66000, len: 70800, offset: 1c4000 [hawkview_dbg]map buffer index: 5, mem: b6bf5000, len: 70800, offset: 235000 [hawkview_dbg]map buffer index: 6, mem: b6b84000, len: 70800, offset: 2a6000 [hawkview_dbg]map buffer index: 7, me[ 369.707805] [VFE]capture video mode! m: b6b13000, len: 70800, offset: 317000 [hawkview_dbg]map buffer index: 8, mem: b6aa2000, len: 70800, offset: 388000 [hawkview_dbg]map buffer index: 9, mem: b6a31000, len: 70800, offset: 3f9000 [hawkview_dbg]video thread status 101 --> 102 [hawkview_dbg]capture frame command -1 --> 161 [hawkview_dbg]capture frame [ 369.741120] [VFE]capture video first frame done! status -1 --> 0 [hawkview_dbg]capture start streaming [hawkview_dbg]capture frame command 161 --> 0 [hawkview_dbg]capture frame status 0 --> 1 (在WIN7下通过ADB执行:echo "149:test1013.yuv#" > command) [hawkview_dbg]read cmd 149:test1013.yuv# [hawkview_dbg]cmd 0: 149 [hawkview_dbg]cmd 1: test1013.yuv [hawkview_dbg]send command 149 [hawkview_dbg]index: 9 buffers[buf.index].start = 0xb6a31000 [hawkview_dbg]image_name: /tmp/test1013.yuv [hawkview_err]xxxxOpen sync file error[hawkview_dbg]image exif info: image_name = test1013.yuv width = 640 height = 480 exp_time_num = 0 exp_time_den = 0 sht_speed_num = 0 sht_speed_den = 0 fnumber = 0 exp_bias = 0 foc_length = 0 iso_speed = 0 flash_fire = 0 brightness = 0 # [hawkview_dbg]--------set_exif_info end (由于cameratest不能自行退出,只能按ctrl+C强制退出!) ^C[ 418.120438] [VFE]vfe_close [ 418.123429] [VFE]mclk off [ 418.162612] [VFE]vfe_runtime_suspend [ 418.166546] [VFE]..........................vfe clk close!....................... [ 418.183428] [VFE]vfe_close end root@TinaLinux:/bin# root@TinaLinux:/bin# 现在在WIN7在通过命令行的ADB连接全志R40平台: Microsoft Windows [版本 6.1.7600] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>adb shell BusyBox v1.24.1 () built-in shell (ash) _____ _ __ _ |_ _||_| ___ _ _ | | |_| ___ _ _ _ _ | | _ | || | | |__ | || || | ||_'_| | | | || | || _ | |_____||_||_|_||___||_,_| |_| |_||_|_||_|_| Tina is Based on OpenWrt! ---------------------------------------------- Tina Linux (Neptune, 5861D22E) ---------------------------------------------- root@TinaLinux:/# root@TinaLinux:/# cd /tmp cd /tmp root@TinaLinux:/tmp# root@TinaLinux:/tmp# ll ll drwxrwxrwt 10 root root 280 Jan 1 18:38 . drwxr-xr-x 1 root root 1024 Jan 1 18:38 .. drwx------ 2 root root 40 Jan 1 18:38 .uci -rw-r--r-- 1 root root 6 Jan 1 18:38 TZ -rw-r--r-- 1 root root 5 Jan 1 18:38 booting_state drwxr-xr-x 3 root root 60 Jan 1 18:38 lib drwxrwxrwx 2 root root 40 Jan 1 18:38 lock drwxr-xr-x 2 root root 80 Jan 1 18:38 log lrwxrwxrwx 1 root root 21 Jan 1 18:38 resolv.conf -> /tmp/resolv.conf.auto -rw-r--r-- 1 root root 0 Jan 1 18:38 resolv.conf.auto drwxrwxrwx 3 root root 160 Jan 1 18:38 run drwxrwxrwt 2 root root 40 Jan 1 18:38 shm drwxrwxrwx 2 root root 60 Jan 1 18:38 state drwxr-xr-x 2 root root 40 Jan 1 18:38 tmp root@TinaLinux:/tmp# root@TinaLinux:/tmp# (这里告诉cameratest分辨率是:640x480) root@TinaLinux:/tmp# echo "146:0:1:640x480#" > command echo "146:0:1:640x480#" > command root@TinaLinux:/tmp# root@TinaLinux:/tmp# root@TinaLinux:/tmp# cat command cat command 146:0:1:640x480# root@TinaLinux:/tmp# root@TinaLinux:/tmp# (告诉cameratest抓图,文件名为:test1013.yuv) root@TinaLinux:/tmp# echo "149:test1013.yuv#" > command echo "149:test1013.yuv#" > command root@TinaLinux:/tmp# root@TinaLinux:/tmp# ll ll drwxrwxrwt 10 root root 340 Jan 1 18:45 . drwxr-xr-x 1 root root 1024 Jan 1 18:38 .. drwx------ 2 root root 40 Jan 1 18:38 .uci -rw-r--r-- 1 root root 6 Jan 1 18:38 TZ -rw-r--r-- 1 root root 5 Jan 1 18:38 booting_state -rw-rw-rw- 1 root root 18 Jan 1 18:45 command drwxr-xr-x 3 root root 60 Jan 1 18:38 lib drwxrwxrwx 2 root root 40 Jan 1 18:38 lock drwxr-xr-x 2 root root 80 Jan 1 18:38 log lrwxrwxrwx 1 root root 21 Jan 1 18:38 resolv.conf -> /tmp/resolv.conf.auto -rw-r--r-- 1 root root 0 Jan 1 18:38 resolv.conf.auto drwxrwxrwx 3 root root 160 Jan 1 18:38 run drwxrwxrwt 2 root root 40 Jan 1 18:38 shm drwxrwxrwx 2 root root 60 Jan 1 18:38 state -rw-r--r-- 1 root root 1000 Jan 1 18:45 test1013.yuv.exif drwxr-xr-x 2 root root 40 Jan 1 18:38 tmp -rw-r--r-- 1 root root 460800 Jan 1 18:45 yuvtest1013.yuv root@TinaLinux:/tmp# root@TinaLinux:/tmp# cat command cat command 149:test1013.yuv# root@TinaLinux:/tmp# root@TinaLinux:/tmp# 7、通过ADB获取NV12格式的YUV图片到WIN7上: root@TinaLinux:/tmp# exit exit C:\Users\Administrator> C:\Users\Administrator>cd c:\tmp (简单粗暴,直接将/tmp目录下的所有文件通过ADB全部拉到WIN7上!) c:\tmp>adb pull /tmp/ . pull: building file list... skipping special file 'resolv.conf' skipping special file 'ubus.sock' skipping special file 'system_bus_socket' pull: /tmp/log/wtmp -> ./log/wtmp pull: /tmp/log/lastlog -> ./log/lastlog pull: /tmp/lib/dbus/machine-id -> ./lib/dbus/machine-id pull: /tmp/state/network -> ./state/network pull: /tmp/run/ntpd.pid -> ./run/ntpd.pid pull: /tmp/run/dbus.pid -> ./run/dbus.pid pull: /tmp/run/config.md5 -> ./run/config.md5 pull: /tmp/run/logread.1.pid -> ./run/logread.1.pid pull: /tmp/booting_state -> ./booting_state pull: /tmp/resolv.conf.auto -> ./resolv.conf.auto pull: /tmp/TZ -> ./TZ pull: /tmp/command -> ./command pull: /tmp/test1013.yuv.exif -> ./test1013.yuv.exif pull: /tmp/yuvtest1013.yuv -> ./yuvtest1013.yuv 14 files pulled. 0 files skipped. 2042 KB/s (462316 bytes in 0.221s) c:\tmp> 8、使用yuvplayer.exe查看NV12格式的YUV图片: 设置如下: Size:VGA(640x480) Color:NV12 9、已知问题:使用fpscamera连续抓100张图片,可以发现细微的横条纹! 使用全志R16平台tina v2.1系统下的解决方法无效!