diff --git a/selfdrive/camerad/SConscript b/selfdrive/camerad/SConscript index e1930a83f9..6d358f6e6b 100644 --- a/selfdrive/camerad/SConscript +++ b/selfdrive/camerad/SConscript @@ -8,6 +8,10 @@ if arch == "aarch64": elif arch == "larch64": libs += [] cameras = ['cameras/camera_qcom2.c'] + # no screen + env = env.Clone() + env.Append(CXXFLAGS = '-DNOSCREEN') + env.Append(CFLAGS = '-DNOSCREEN') else: if webcam: libs += ['opencv_core', 'opencv_highgui', 'opencv_imgproc', 'opencv_videoio'] diff --git a/selfdrive/camerad/cameras/camera_qcom2.c b/selfdrive/camerad/cameras/camera_qcom2.c index 75fa803a53..6d526b6f57 100644 --- a/selfdrive/camerad/cameras/camera_qcom2.c +++ b/selfdrive/camerad/cameras/camera_qcom2.c @@ -45,7 +45,7 @@ CameraInfo cameras_supported[CAMERA_ID_MAX] = { .frame_height = FRAME_HEIGHT, .frame_stride = FRAME_STRIDE, .bayer = true, - .bayer_flip = 0, + .bayer_flip = 1, .hdr = false }, }; @@ -777,6 +777,11 @@ void cameras_init(DualCameraState *s) { camera_init(&s->rear, CAMERA_ID_AR0231, 0, 20); camera_init(&s->wide, CAMERA_ID_AR0231, 1, 20); camera_init(&s->front, CAMERA_ID_AR0231, 2, 20); +#ifdef NOSCREEN + zsock_t *rgb_sock = zsock_new_push("tcp://192.168.2.221:7768"); + assert(rgb_sock); + s->rgb_sock = rgb_sock; +#endif } void cameras_open(DualCameraState *s, VisionBuf *camera_bufs_rear, VisionBuf *camera_bufs_focus, VisionBuf *camera_bufs_stats, VisionBuf *camera_bufs_front) { @@ -882,6 +887,9 @@ static void cameras_close(DualCameraState *s) { camera_close(&s->rear); //camera_close(&s->front); //camera_close(&s->wide); +#ifdef NOSCREEN + zsock_destroy(&s->rgb_sock) +#endif } struct video_event_data { @@ -942,5 +950,24 @@ void cameras_run(DualCameraState *s) { } void camera_autoexposure(CameraState *s, float grey_frac) { + // TODO: implement autoexposure + struct i2c_random_wr_payload exp_reg_array[] = {{0x3366, 0x7777}, // analog gain + // {0x3056, 0x0080}, // G1 + // {0x3058, 0x012A}, // B + // {0x305A, 0x00A0}, // R + // {0x305C, 0x0080}, // G2 + // {0x305E, 0x0080}, // global digi gain + {0x3012, 0x0312}}; // integ time + + sensors_i2c(s, exp_reg_array, sizeof(exp_reg_array)/sizeof(struct i2c_random_wr_payload), + CAM_SENSOR_PACKET_OPCODE_SENSOR_CONFIG); } +#ifdef NOSCREEN +void sendrgb(DualCameraState *s, void* dat, int len) { + int err, err2; + err = zmq_send(zsock_reslove(s->rgb_sock), dat, len, ZMQ_DONTWAIT); + err2 = zmq_errno(); + printf("zmq errcode %d, %d\n", err ,err2); +} +#endif \ No newline at end of file diff --git a/selfdrive/camerad/cameras/camera_qcom2.h b/selfdrive/camerad/cameras/camera_qcom2.h index b15ea8b128..78d1264538 100644 --- a/selfdrive/camerad/cameras/camera_qcom2.h +++ b/selfdrive/camerad/cameras/camera_qcom2.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "common/mat.h" #include "common/visionbuf.h" @@ -71,12 +72,18 @@ typedef struct DualCameraState { CameraState rear; CameraState front; CameraState wide; +#ifdef NOSCREEN + zsock_t *rgb_sock; +#endif } DualCameraState; void cameras_init(DualCameraState *s); void cameras_open(DualCameraState *s, VisionBuf *camera_bufs_rear, VisionBuf *camera_bufs_focus, VisionBuf *camera_bufs_stats, VisionBuf *camera_bufs_front); void cameras_run(DualCameraState *s); void camera_autoexposure(CameraState *s, float grey_frac); +#ifdef NOSCREEN +void sendrgb(DualCameraState *s, void* dat, int len); +#endif #ifdef __cplusplus } // extern "C" diff --git a/selfdrive/camerad/cameras/sensor2_i2c.h b/selfdrive/camerad/cameras/sensor2_i2c.h index 621d28251e..9e8273e549 100644 --- a/selfdrive/camerad/cameras/sensor2_i2c.h +++ b/selfdrive/camerad/cameras/sensor2_i2c.h @@ -3,302 +3,344 @@ struct i2c_random_wr_payload start_reg_array[] = {{0x301a, 0x1c}}; struct i2c_random_wr_payload stop_reg_array[] = {{0x301a, 0x18}};; struct i2c_random_wr_payload init_array_ar0231[] = { - {0x3092, 0x0C24}, - {0x337A, 0x0C80}, - {0x3520, 0x1288}, - {0x3522, 0x880C}, - {0x3524, 0x0C12}, - {0x352C, 0x1212}, - {0x354A, 0x007F}, - {0x350C, 28}, - {0x3506, 0x3333}, - {0x3508, 0x3333}, - {0x3100, 0x4000}, - {0x3280, 0x0FA0}, - {0x3282, 0x0FA0}, - {0x3284, 0x0FA0}, - {0x3286, 0x0FA0}, - {0x3288, 0x0FA0}, - {0x328A, 0x0FA0}, - {0x328C, 0x0FA0}, - {0x328E, 0x0FA0}, - {0x3290, 0x0FA0}, - {0x3292, 0x0FA0}, - {0x3294, 0x0FA0}, - {0x3296, 0x0FA0}, - {0x3298, 0x0FA0}, - {0x329A, 0x0FA0}, - {0x329C, 0x0FA0}, - {0x329E, 0x0FA0}, + {0x301A, 0x0018}, // RESET_REGISTER - // SEQ_DATA_PORT? - {0x2512, 0x8000}, - {0x2510, 0x0905}, - {0x2510, 0x3350}, - {0x2510, 0x2004}, - {0x2510, 0x1460}, - {0x2510, 0x1578}, - {0x2510, 0x0901}, - {0x2510, 0x7B24}, - {0x2510, 0xFF24}, - {0x2510, 0xFF24}, - {0x2510, 0xEA24}, - {0x2510, 0x1022}, - {0x2510, 0x2410}, - {0x2510, 0x155A}, - {0x2510, 0x0901}, - {0x2510, 0x1400}, - {0x2510, 0x24FF}, - {0x2510, 0x24FF}, - {0x2510, 0x24EA}, - {0x2510, 0x2324}, - {0x2510, 0x647A}, - {0x2510, 0x2404}, - {0x2510, 0x052C}, - {0x2510, 0x400A}, - {0x2510, 0xFF0A}, - {0x2510, 0xFF0A}, - {0x2510, 0x1008}, - {0x2510, 0x3851}, - {0x2510, 0x1440}, - {0x2510, 0x0004}, - {0x2510, 0x0801}, - {0x2510, 0x0408}, - {0x2510, 0x1180}, - {0x2510, 0x2652}, - {0x2510, 0x1518}, - {0x2510, 0x0906}, - {0x2510, 0x1348}, - {0x2510, 0x1002}, - {0x2510, 0x1016}, - {0x2510, 0x1181}, - {0x2510, 0x1189}, - {0x2510, 0x1056}, - {0x2510, 0x1210}, - {0x2510, 0x0901}, - {0x2510, 0x0D09}, - {0x2510, 0x1413}, - {0x2510, 0x8809}, - {0x2510, 0x2B15}, - {0x2510, 0x8809}, - {0x2510, 0x0311}, - {0x2510, 0xD909}, - {0x2510, 0x1214}, - {0x2510, 0x4109}, - {0x2510, 0x0312}, - {0x2510, 0x1409}, - {0x2510, 0x0110}, - {0x2510, 0xD612}, - {0x2510, 0x1012}, - {0x2510, 0x1212}, - {0x2510, 0x1011}, - {0x2510, 0xDD11}, - {0x2510, 0xD910}, - {0x2510, 0x5609}, - {0x2510, 0x1511}, - {0x2510, 0xDB09}, - {0x2510, 0x1511}, - {0x2510, 0x9B09}, - {0x2510, 0x0F11}, - {0x2510, 0xBB12}, - {0x2510, 0x1A12}, - {0x2510, 0x1014}, - {0x2510, 0x6012}, - {0x2510, 0x5010}, - {0x2510, 0x7610}, - {0x2510, 0xE609}, - {0x2510, 0x0812}, - {0x2510, 0x4012}, - {0x2510, 0x6009}, - {0x2510, 0x290B}, - {0x2510, 0x0904}, - {0x2510, 0x1440}, - {0x2510, 0x0923}, - {0x2510, 0x15C8}, - {0x2510, 0x13C8}, - {0x2510, 0x092C}, - {0x2510, 0x1588}, - {0x2510, 0x1388}, - {0x2510, 0x0C09}, - {0x2510, 0x0C14}, - {0x2510, 0x4109}, - {0x2510, 0x1112}, - {0x2510, 0x6212}, - {0x2510, 0x6011}, - {0x2510, 0xBF11}, - {0x2510, 0xBB10}, - {0x2510, 0x6611}, - {0x2510, 0xFB09}, - {0x2510, 0x3511}, - {0x2510, 0xBB12}, - {0x2510, 0x6312}, - {0x2510, 0x6014}, - {0x2510, 0x0015}, - {0x2510, 0x0011}, - {0x2510, 0xB812}, - {0x2510, 0xA012}, - {0x2510, 0x0010}, - {0x2510, 0x2610}, - {0x2510, 0x0013}, - {0x2510, 0x0011}, - {0x2510, 0x0008}, - {0x2510, 0x3053}, - {0x2510, 0x4215}, - {0x2510, 0x4013}, - {0x2510, 0x4010}, - {0x2510, 0x0210}, - {0x2510, 0x1611}, - {0x2510, 0x8111}, - {0x2510, 0x8910}, - {0x2510, 0x5612}, - {0x2510, 0x1009}, - {0x2510, 0x010D}, - {0x2510, 0x0815}, - {0x2510, 0xC015}, - {0x2510, 0xD013}, - {0x2510, 0x5009}, - {0x2510, 0x1313}, - {0x2510, 0xD009}, - {0x2510, 0x0215}, - {0x2510, 0xC015}, - {0x2510, 0xC813}, - {0x2510, 0xC009}, - {0x2510, 0x0515}, - {0x2510, 0x8813}, - {0x2510, 0x8009}, - {0x2510, 0x0213}, - {0x2510, 0x8809}, - {0x2510, 0x0411}, - {0x2510, 0xC909}, - {0x2510, 0x0814}, - {0x2510, 0x0109}, - {0x2510, 0x0B11}, - {0x2510, 0xD908}, - {0x2510, 0x1400}, - {0x2510, 0x091A}, - {0x2510, 0x1440}, - {0x2510, 0x0903}, - {0x2510, 0x1214}, - {0x2510, 0x0901}, - {0x2510, 0x10D6}, - {0x2510, 0x1210}, - {0x2510, 0x1212}, - {0x2510, 0x1210}, - {0x2510, 0x11DD}, - {0x2510, 0x11D9}, - {0x2510, 0x1056}, - {0x2510, 0x0917}, - {0x2510, 0x11DB}, - {0x2510, 0x0913}, - {0x2510, 0x11FB}, - {0x2510, 0x0905}, - {0x2510, 0x11BB}, - {0x2510, 0x121A}, - {0x2510, 0x1210}, - {0x2510, 0x1460}, - {0x2510, 0x1250}, - {0x2510, 0x1076}, - {0x2510, 0x10E6}, - {0x2510, 0x0901}, - {0x2510, 0x15A8}, - {0x2510, 0x0901}, - {0x2510, 0x13A8}, - {0x2510, 0x1240}, - {0x2510, 0x1260}, - {0x2510, 0x0925}, - {0x2510, 0x13AD}, - {0x2510, 0x0902}, - {0x2510, 0x0907}, - {0x2510, 0x1588}, - {0x2510, 0x0901}, - {0x2510, 0x138D}, - {0x2510, 0x0B09}, - {0x2510, 0x0914}, - {0x2510, 0x4009}, - {0x2510, 0x0B13}, - {0x2510, 0x8809}, - {0x2510, 0x1C0C}, - {0x2510, 0x0920}, - {0x2510, 0x1262}, - {0x2510, 0x1260}, - {0x2510, 0x11BF}, - {0x2510, 0x11BB}, - {0x2510, 0x1066}, - {0x2510, 0x090A}, - {0x2510, 0x11FB}, - {0x2510, 0x093B}, - {0x2510, 0x11BB}, - {0x2510, 0x1263}, - {0x2510, 0x1260}, - {0x2510, 0x1400}, - {0x2510, 0x1508}, - {0x2510, 0x11B8}, - {0x2510, 0x12A0}, - {0x2510, 0x1200}, - {0x2510, 0x1026}, - {0x2510, 0x1000}, - {0x2510, 0x1300}, - {0x2510, 0x1100}, - {0x2510, 0x437A}, - {0x2510, 0x0609}, - {0x2510, 0x0B05}, - {0x2510, 0x0708}, - {0x2510, 0x4137}, - {0x2510, 0x502C}, - {0x2510, 0x2CFE}, - {0x2510, 0x15FE}, - {0x2510, 0x0C2C}, + // + {0x3092, 0x0C24}, // ROW_NOISE_CONTROL + {0x337A, 0x0C80}, // DBLC_SCALE0 + {0x3520, 0x1288}, // RESERVED_MFR_3520 + {0x3522, 0x880C}, // RESERVED_MFR_3522 + {0x3524, 0x0C12}, // RESERVED_MFR_3524 + {0x352C, 0x1212}, // RESERVED_MFR_352C + {0x354A, 0x007F}, // RESERVED_MFR_354A + {0x350C, 0x055C}, // RESERVED_MFR_350C + {0x3506, 0x3333}, // RESERVED_MFR_3506 + {0x3508, 0x3333}, // RESERVED_MFR_3508 + {0x3100, 0x4000}, // DLO_CONTROL0 + {0x3280, 0x0FA0}, // RESERVED_MFR_3280 + {0x3282, 0x0FA0}, // RESERVED_MFR_3282 + {0x3284, 0x0FA0}, // RESERVED_MFR_3284 + {0x3286, 0x0FA0}, // RESERVED_MFR_3286 + {0x3288, 0x0FA0}, // RESERVED_MFR_3288 + {0x328A, 0x0FA0}, // RESERVED_MFR_328A + {0x328C, 0x0FA0}, // RESERVED_MFR_328C + {0x328E, 0x0FA0}, // RESERVED_MFR_328E + {0x3290, 0x0FA0}, // RESERVED_MFR_3290 + {0x3292, 0x0FA0}, // RESERVED_MFR_3292 + {0x3294, 0x0FA0}, // RESERVED_MFR_3294 + {0x3296, 0x0FA0}, // RESERVED_MFR_3296 + {0x3298, 0x0FA0}, // RESERVED_MFR_3298 + {0x329A, 0x0FA0}, // RESERVED_MFR_329A + {0x329C, 0x0FA0}, // RESERVED_MFR_329C + {0x329E, 0x0FA0}, // RESERVED_MFR_329E + {0x2512, 0x8000}, // SEQ_CTRL_PORT + {0x2510, 0x0905}, // SEQ_DATA_PORT + {0x2510, 0x3350}, // SEQ_DATA_PORT + {0x2510, 0x2004}, // SEQ_DATA_PORT + {0x2510, 0x1460}, // SEQ_DATA_PORT + {0x2510, 0x1578}, // SEQ_DATA_PORT + {0x2510, 0x0901}, // SEQ_DATA_PORT + {0x2510, 0x7B24}, // SEQ_DATA_PORT + {0x2510, 0xFF24}, // SEQ_DATA_PORT + {0x2510, 0xFF24}, // SEQ_DATA_PORT + {0x2510, 0xEA24}, // SEQ_DATA_PORT + {0x2510, 0x1022}, // SEQ_DATA_PORT + {0x2510, 0x2410}, // SEQ_DATA_PORT + {0x2510, 0x155A}, // SEQ_DATA_PORT + {0x2510, 0x0901}, // SEQ_DATA_PORT + {0x2510, 0x1400}, // SEQ_DATA_PORT + {0x2510, 0x24FF}, // SEQ_DATA_PORT + {0x2510, 0x24FF}, // SEQ_DATA_PORT + {0x2510, 0x24EA}, // SEQ_DATA_PORT + {0x2510, 0x2324}, // SEQ_DATA_PORT + {0x2510, 0x647A}, // SEQ_DATA_PORT + {0x2510, 0x2404}, // SEQ_DATA_PORT + {0x2510, 0x052C}, // SEQ_DATA_PORT + {0x2510, 0x400A}, // SEQ_DATA_PORT + {0x2510, 0xFF0A}, // SEQ_DATA_PORT + {0x2510, 0xFF0A}, // SEQ_DATA_PORT + {0x2510, 0x1008}, // SEQ_DATA_PORT + {0x2510, 0x3851}, // SEQ_DATA_PORT + {0x2510, 0x1440}, // SEQ_DATA_PORT + {0x2510, 0x0004}, // SEQ_DATA_PORT + {0x2510, 0x0801}, // SEQ_DATA_PORT + {0x2510, 0x0408}, // SEQ_DATA_PORT + {0x2510, 0x1180}, // SEQ_DATA_PORT + {0x2510, 0x2652}, // SEQ_DATA_PORT + {0x2510, 0x1518}, // SEQ_DATA_PORT + {0x2510, 0x0906}, // SEQ_DATA_PORT + {0x2510, 0x1348}, // SEQ_DATA_PORT + {0x2510, 0x1002}, // SEQ_DATA_PORT + {0x2510, 0x1016}, // SEQ_DATA_PORT + {0x2510, 0x1181}, // SEQ_DATA_PORT + {0x2510, 0x1189}, // SEQ_DATA_PORT + {0x2510, 0x1056}, // SEQ_DATA_PORT + {0x2510, 0x1210}, // SEQ_DATA_PORT + {0x2510, 0x0901}, // SEQ_DATA_PORT + {0x2510, 0x0D09}, // SEQ_DATA_PORT + {0x2510, 0x1413}, // SEQ_DATA_PORT + {0x2510, 0x8809}, // SEQ_DATA_PORT + {0x2510, 0x2B15}, // SEQ_DATA_PORT + {0x2510, 0x8809}, // SEQ_DATA_PORT + {0x2510, 0x0311}, // SEQ_DATA_PORT + {0x2510, 0xD909}, // SEQ_DATA_PORT + {0x2510, 0x1214}, // SEQ_DATA_PORT + {0x2510, 0x4109}, // SEQ_DATA_PORT + {0x2510, 0x0312}, // SEQ_DATA_PORT + {0x2510, 0x1409}, // SEQ_DATA_PORT + {0x2510, 0x0110}, // SEQ_DATA_PORT + {0x2510, 0xD612}, // SEQ_DATA_PORT + {0x2510, 0x1012}, // SEQ_DATA_PORT + {0x2510, 0x1212}, // SEQ_DATA_PORT + {0x2510, 0x1011}, // SEQ_DATA_PORT + {0x2510, 0xDD11}, // SEQ_DATA_PORT + {0x2510, 0xD910}, // SEQ_DATA_PORT + {0x2510, 0x5609}, // SEQ_DATA_PORT + {0x2510, 0x1511}, // SEQ_DATA_PORT + {0x2510, 0xDB09}, // SEQ_DATA_PORT + {0x2510, 0x1511}, // SEQ_DATA_PORT + {0x2510, 0x9B09}, // SEQ_DATA_PORT + {0x2510, 0x0F11}, // SEQ_DATA_PORT + {0x2510, 0xBB12}, // SEQ_DATA_PORT + {0x2510, 0x1A12}, // SEQ_DATA_PORT + {0x2510, 0x1014}, // SEQ_DATA_PORT + {0x2510, 0x6012}, // SEQ_DATA_PORT + {0x2510, 0x5010}, // SEQ_DATA_PORT + {0x2510, 0x7610}, // SEQ_DATA_PORT + {0x2510, 0xE609}, // SEQ_DATA_PORT + {0x2510, 0x0812}, // SEQ_DATA_PORT + {0x2510, 0x4012}, // SEQ_DATA_PORT + {0x2510, 0x6009}, // SEQ_DATA_PORT + {0x2510, 0x290B}, // SEQ_DATA_PORT + {0x2510, 0x0904}, // SEQ_DATA_PORT + {0x2510, 0x1440}, // SEQ_DATA_PORT + {0x2510, 0x0923}, // SEQ_DATA_PORT + {0x2510, 0x15C8}, // SEQ_DATA_PORT + {0x2510, 0x13C8}, // SEQ_DATA_PORT + {0x2510, 0x092C}, // SEQ_DATA_PORT + {0x2510, 0x1588}, // SEQ_DATA_PORT + {0x2510, 0x1388}, // SEQ_DATA_PORT + {0x2510, 0x0C09}, // SEQ_DATA_PORT + {0x2510, 0x0C14}, // SEQ_DATA_PORT + {0x2510, 0x4109}, // SEQ_DATA_PORT + {0x2510, 0x1112}, // SEQ_DATA_PORT + {0x2510, 0x6212}, // SEQ_DATA_PORT + {0x2510, 0x6011}, // SEQ_DATA_PORT + {0x2510, 0xBF11}, // SEQ_DATA_PORT + {0x2510, 0xBB10}, // SEQ_DATA_PORT + {0x2510, 0x6611}, // SEQ_DATA_PORT + {0x2510, 0xFB09}, // SEQ_DATA_PORT + {0x2510, 0x3511}, // SEQ_DATA_PORT + {0x2510, 0xBB12}, // SEQ_DATA_PORT + {0x2510, 0x6312}, // SEQ_DATA_PORT + {0x2510, 0x6014}, // SEQ_DATA_PORT + {0x2510, 0x0015}, // SEQ_DATA_PORT + {0x2510, 0x0011}, // SEQ_DATA_PORT + {0x2510, 0xB812}, // SEQ_DATA_PORT + {0x2510, 0xA012}, // SEQ_DATA_PORT + {0x2510, 0x0010}, // SEQ_DATA_PORT + {0x2510, 0x2610}, // SEQ_DATA_PORT + {0x2510, 0x0013}, // SEQ_DATA_PORT + {0x2510, 0x0011}, // SEQ_DATA_PORT + {0x2510, 0x0008}, // SEQ_DATA_PORT + {0x2510, 0x3053}, // SEQ_DATA_PORT + {0x2510, 0x4215}, // SEQ_DATA_PORT + {0x2510, 0x4013}, // SEQ_DATA_PORT + {0x2510, 0x4010}, // SEQ_DATA_PORT + {0x2510, 0x0210}, // SEQ_DATA_PORT + {0x2510, 0x1611}, // SEQ_DATA_PORT + {0x2510, 0x8111}, // SEQ_DATA_PORT + {0x2510, 0x8910}, // SEQ_DATA_PORT + {0x2510, 0x5612}, // SEQ_DATA_PORT + {0x2510, 0x1009}, // SEQ_DATA_PORT + {0x2510, 0x010D}, // SEQ_DATA_PORT + {0x2510, 0x0815}, // SEQ_DATA_PORT + {0x2510, 0xC015}, // SEQ_DATA_PORT + {0x2510, 0xD013}, // SEQ_DATA_PORT + {0x2510, 0x5009}, // SEQ_DATA_PORT + {0x2510, 0x1313}, // SEQ_DATA_PORT + {0x2510, 0xD009}, // SEQ_DATA_PORT + {0x2510, 0x0215}, // SEQ_DATA_PORT + {0x2510, 0xC015}, // SEQ_DATA_PORT + {0x2510, 0xC813}, // SEQ_DATA_PORT + {0x2510, 0xC009}, // SEQ_DATA_PORT + {0x2510, 0x0515}, // SEQ_DATA_PORT + {0x2510, 0x8813}, // SEQ_DATA_PORT + {0x2510, 0x8009}, // SEQ_DATA_PORT + {0x2510, 0x0213}, // SEQ_DATA_PORT + {0x2510, 0x8809}, // SEQ_DATA_PORT + {0x2510, 0x0411}, // SEQ_DATA_PORT + {0x2510, 0xC909}, // SEQ_DATA_PORT + {0x2510, 0x0814}, // SEQ_DATA_PORT + {0x2510, 0x0109}, // SEQ_DATA_PORT + {0x2510, 0x0B11}, // SEQ_DATA_PORT + {0x2510, 0xD908}, // SEQ_DATA_PORT + {0x2510, 0x1400}, // SEQ_DATA_PORT + {0x2510, 0x091A}, // SEQ_DATA_PORT + {0x2510, 0x1440}, // SEQ_DATA_PORT + {0x2510, 0x0903}, // SEQ_DATA_PORT + {0x2510, 0x1214}, // SEQ_DATA_PORT + {0x2510, 0x0901}, // SEQ_DATA_PORT + {0x2510, 0x10D6}, // SEQ_DATA_PORT + {0x2510, 0x1210}, // SEQ_DATA_PORT + {0x2510, 0x1212}, // SEQ_DATA_PORT + {0x2510, 0x1210}, // SEQ_DATA_PORT + {0x2510, 0x11DD}, // SEQ_DATA_PORT + {0x2510, 0x11D9}, // SEQ_DATA_PORT + {0x2510, 0x1056}, // SEQ_DATA_PORT + {0x2510, 0x0917}, // SEQ_DATA_PORT + {0x2510, 0x11DB}, // SEQ_DATA_PORT + {0x2510, 0x0913}, // SEQ_DATA_PORT + {0x2510, 0x11FB}, // SEQ_DATA_PORT + {0x2510, 0x0905}, // SEQ_DATA_PORT + {0x2510, 0x11BB}, // SEQ_DATA_PORT + {0x2510, 0x121A}, // SEQ_DATA_PORT + {0x2510, 0x1210}, // SEQ_DATA_PORT + {0x2510, 0x1460}, // SEQ_DATA_PORT + {0x2510, 0x1250}, // SEQ_DATA_PORT + {0x2510, 0x1076}, // SEQ_DATA_PORT + {0x2510, 0x10E6}, // SEQ_DATA_PORT + {0x2510, 0x0901}, // SEQ_DATA_PORT + {0x2510, 0x15A8}, // SEQ_DATA_PORT + {0x2510, 0x0901}, // SEQ_DATA_PORT + {0x2510, 0x13A8}, // SEQ_DATA_PORT + {0x2510, 0x1240}, // SEQ_DATA_PORT + {0x2510, 0x1260}, // SEQ_DATA_PORT + {0x2510, 0x0925}, // SEQ_DATA_PORT + {0x2510, 0x13AD}, // SEQ_DATA_PORT + {0x2510, 0x0902}, // SEQ_DATA_PORT + {0x2510, 0x0907}, // SEQ_DATA_PORT + {0x2510, 0x1588}, // SEQ_DATA_PORT + {0x2510, 0x0901}, // SEQ_DATA_PORT + {0x2510, 0x138D}, // SEQ_DATA_PORT + {0x2510, 0x0B09}, // SEQ_DATA_PORT + {0x2510, 0x0914}, // SEQ_DATA_PORT + {0x2510, 0x4009}, // SEQ_DATA_PORT + {0x2510, 0x0B13}, // SEQ_DATA_PORT + {0x2510, 0x8809}, // SEQ_DATA_PORT + {0x2510, 0x1C0C}, // SEQ_DATA_PORT + {0x2510, 0x0920}, // SEQ_DATA_PORT + {0x2510, 0x1262}, // SEQ_DATA_PORT + {0x2510, 0x1260}, // SEQ_DATA_PORT + {0x2510, 0x11BF}, // SEQ_DATA_PORT + {0x2510, 0x11BB}, // SEQ_DATA_PORT + {0x2510, 0x1066}, // SEQ_DATA_PORT + {0x2510, 0x090A}, // SEQ_DATA_PORT + {0x2510, 0x11FB}, // SEQ_DATA_PORT + {0x2510, 0x093B}, // SEQ_DATA_PORT + {0x2510, 0x11BB}, // SEQ_DATA_PORT + {0x2510, 0x1263}, // SEQ_DATA_PORT + {0x2510, 0x1260}, // SEQ_DATA_PORT + {0x2510, 0x1400}, // SEQ_DATA_PORT + {0x2510, 0x1508}, // SEQ_DATA_PORT + {0x2510, 0x11B8}, // SEQ_DATA_PORT + {0x2510, 0x12A0}, // SEQ_DATA_PORT + {0x2510, 0x1200}, // SEQ_DATA_PORT + {0x2510, 0x1026}, // SEQ_DATA_PORT + {0x2510, 0x1000}, // SEQ_DATA_PORT + {0x2510, 0x1300}, // SEQ_DATA_PORT + {0x2510, 0x1100}, // SEQ_DATA_PORT + {0x2510, 0x437A}, // SEQ_DATA_PORT + {0x2510, 0x0609}, // SEQ_DATA_PORT + {0x2510, 0x0B05}, // SEQ_DATA_PORT + {0x2510, 0x0708}, // SEQ_DATA_PORT + {0x2510, 0x4137}, // SEQ_DATA_PORT + {0x2510, 0x502C}, // SEQ_DATA_PORT + {0x2510, 0x2CFE}, // SEQ_DATA_PORT + {0x2510, 0x15FE}, // SEQ_DATA_PORT + {0x2510, 0x0C2C}, // SEQ_DATA_PORT + {0x32E6, 0x00E0}, // RESERVED_MFR_32E6 + {0x1008, 0x036F}, // RESERVED_PARAM_1008 + {0x100C, 0x058F}, // RESERVED_PARAM_100C + {0x100E, 0x07AF}, // RESERVED_PARAM_100E + {0x1010, 0x014F}, // RESERVED_PARAM_1010 + {0x3230, 0x0312}, // FINE_CORRECTION + {0x3232, 0x0532}, // FINE_CORRECTION2 + {0x3234, 0x0752}, // FINE_CORRECTION3 + {0x3236, 0x00F2}, // FINE_CORRECTION4 + {0x3566, 0x3328}, // RESERVED_MFR_3566 + {0x32D0, 0x3A02}, // RESERVED_MFR_32D0 + {0x32D2, 0x3508}, // RESERVED_MFR_32D2 + {0x32D4, 0x3702}, // RESERVED_MFR_32D4 + {0x32D6, 0x3C04}, // RESERVED_MFR_32D6 + {0x32DC, 0x370A}, // RESERVED_MFR_32DC + {0x30B0, 0x0800}, // DIGITAL_TEST + {0x302A, 0x0006}, // VT_PIX_CLK_DIV + {0x302C, 0x0001}, // VT_SYS_CLK_DIV + {0x302E, 0x0002}, // PRE_PLL_CLK_DIV + {0x3030, 0x002C}, // PLL_MULTIPLIER + {0x3036, 0x000A}, // OP_WORD_CLK_DIV + {0x3038, 0x0001}, // OP_SYS_CLK_DIV + {0x30B0, 0x0800}, // DIGITAL_TEST + {0x30A2, 0x0001}, // X_ODD_INC_ + {0x30A6, 0x0001}, // Y_ODD_INC_ + {0x3040, 0x0000}, // READ_MODE C000? + {0x30BA, 0x11F2}, // DIGITAL_CTRL + {0x3044, 0x0400}, // DARK_CONTROL + {0x3064, 0x1802}, // SMIA_TEST + {0x33E0, 0x0C80}, // TEST_ASIL_ROWS + {0x3180, 0x0080}, // RESERVED_MFR_3180 + {0x33E4, 0x0080}, // RESERVED_MFR_33E4 + {0x33E0, 0x0C80}, // TEST_ASIL_ROWS + {0x33E0, 0x0C80}, // TEST_ASIL_ROWS + {0x3004, 0x0000}, // X_ADDR_START_ + {0x3008, 0x0787}, // X_ADDR_END_ + {0x3002, 0x0000}, // Y_ADDR_START_ + {0x3006, 0x04B7}, // Y_ADDR_END_ + {0x3032, 0x0000}, // SCALING_MODE + {0x3400, 0x0010}, // RESERVED_MFR_3400 + {0x3402, 0x0788}, // X_OUTPUT_CONTROL + {0x3402, 0x0F10}, // X_OUTPUT_CONTROL + {0x3404, 0x04B8}, // Y_OUTPUT_CONTROL + {0x3404, 0x0970}, // Y_OUTPUT_CONTROL + {0x30BA, 0x11F3}, // DIGITAL_CTRL - // end SEQ_DATA_PORT - {0x32e6,0xe0}, + // FPS = 88e6 / 0x09C4 / 0x06E0 = 20 + {0x300C, 0x09C4}, // LINE_LENGTH_PCK_ + {0x300A, 0x06E0}, // FRAME_LENGTH_LINES_ + {0x3042, 0x0000}, // EXTRA_DELAY - // exposure time - {0x1008,0x36f}, - {0x100c,0x58f}, - {0x100e,0x7af}, - {0x1010,0x14f}, - {0x3230,0x312}, - {0x3232,0x532}, - {0x3234,0x752}, - {0x3236,0xf2}, + // Readout Settings + {0x31AE, 0x0204}, // SERIAL_FORMAT, 4-lane MIPI + {0x31AC, 0x0C0A}, // DATA_FORMAT_BITS, 12 -> 10 + {0x3342, 0x122B}, // MIPI_F1_PDT_EDT + {0x3346, 0x122B}, // MIPI_F2_PDT_EDT + {0x334A, 0x122B}, // MIPI_F3_PDT_EDT + {0x334E, 0x122B}, // MIPI_F4_PDT_EDT + {0x3344, 0x0011}, // MIPI_F1_VDT_VC + {0x3348, 0x0111}, // MIPI_F2_VDT_VC + {0x334C, 0x0211}, // MIPI_F3_VDT_VC + {0x3350, 0x0311}, // MIPI_F4_VDT_VC + {0x31B0, 0x0049}, // FRAME_PREAMBLE + {0x31B2, 0x0033}, // LINE_PREAMBLE + {0x31B4, 0x2185}, // RESERVED_MFR_31B4 + {0x31B6, 0x1146}, // RESERVED_MFR_31B6 + {0x31B8, 0x3047}, // RESERVED_MFR_31B8 + {0x31BA, 0x0186}, // RESERVED_MFR_31BA + {0x31BC, 0x0805}, // RESERVED_MFR_31BC + {0x301A, 0x001C}, // RESET_REGISTER - {0x3566, 0x0}, - {0x32D0, 0x3A02}, - {0x32D2, 0x3508}, - {0x32D4, 0x3702}, - {0x32D6, 0x3C04}, - {0x32DC, 0x370A}, - {0x30b0, 0x200}, - {0x3082, 0x0}, - {0x33E0, 0x0080}, - {0x3180, 0x0080}, - {0x33E4, 0x0080}, - {0x33E0, 0x0C00}, - {0x33E0, 0x0000}, + // HDR Settings + {0x3082, 0x0004}, // OPERATION_MODE_CTRL + {0x3238, 0x0222}, // EXPOSURE_RATIO + {0x3014, 0x098E}, // FINE_INTEGRATION_TIME_ + {0x321E, 0x098E}, // FINE_INTEGRATION_TIME2 + {0x3222, 0x098E}, // FINE_INTEGRATION_TIME3 + {0x3226, 0x098E}, // FINE_INTEGRATION_TIME4 + {0x30B0, 0x0800}, // DIGITAL_TEST + {0x32EA, 0x3C0E}, // RESERVED_MFR_32EA + {0x32EC, 0x72A1}, // RESERVED_MFR_32EC + {0x31D0, 0x0001}, // COMPANDING - {0x31B4, 0x2185}, - {0x31B6, 0x1146}, - {0x31B8, 0x3047}, - - {0x31BA, 0x186}, - {0x31BC, 0x805}, - - // additions - // mipi + 4 lanes - {0x31AE, 0x0204}, - // DATA_FORMAT_RAW = 12 - // DATA_FORMAT_OUTPUT = 0? - //{0x31AC, 0x0C08}, - {0x31AC, 0x0C0A}, - - // 0x2B = CSI_RAW10 - {0x3342, 0x122B}, - {0x3346, 0x122B}, - {0x334a, 0x122B}, - {0x334e, 0x122B}, - - // 10-bit - {0x3036, 0xA}, + // Initial Gains + {0x3022, 0x01}, // GROUPED_PARAMETER_HOLD_ + {0x3366, 0x9999}, // ANALOG_GAIN + {0x3060, 0xAAAA}, // ANALOG_COLOR_GAIN + {0x305A, 0x00BB}, // RED_GAIN + {0x3058, 0x012A}, // BLUE_GAIN + {0x3056, 0x0080}, // GREEN1_GAIN + {0x305C, 0x0080}, // GREEN2_GAIN + {0x3022, 0x00}, // GROUPED_PARAMETER_HOLD_ }; struct i2c_random_wr_payload poke_array_ov7750[] = { diff --git a/selfdrive/camerad/test/tici_zclient/livergb.py b/selfdrive/camerad/test/tici_zclient/livergb.py new file mode 100755 index 0000000000..bd16f72a4c --- /dev/null +++ b/selfdrive/camerad/test/tici_zclient/livergb.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +import numpy as np +import cv2 +from time import time, sleep + +H, W = (604, 964) + +if __name__ == '__main__': + import zmq + context = zmq.Context() + socket = context.socket(zmq.PULL) + socket.bind("tcp://192.168.2.221:7768") + while True: + try: + message = socket.recv() + except Exception as ex: + print(ex) + message = b"123" + + dat = np.frombuffer(message, dtype=np.uint8) + b = dat[::3].reshape(H, W) + g = dat[1::3].reshape(H, W) + r = dat[2::3].reshape(H, W) + rgb = cv2.merge((r, g, b)) + rgb = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR) + cv2.imshow('RGB',rgb) + cv2.waitKey(20) + dat.tofile('/tmp/c3rgb.img') \ No newline at end of file diff --git a/selfdrive/camerad/test/tici_zclient/liveyuv.py b/selfdrive/camerad/test/tici_zclient/liveyuv.py new file mode 100755 index 0000000000..eb5c2f99e9 --- /dev/null +++ b/selfdrive/camerad/test/tici_zclient/liveyuv.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +import numpy as np +import cv2 +from time import time, sleep + +H, W = (256, 512) + +if __name__ == '__main__': + import zmq + context = zmq.Context() + socket = context.socket(zmq.PULL) + socket.bind("tcp://192.168.2.221:7769") + while True: + try: + message = socket.recv() + except Exception as ex: + print(ex) + message = b"123" + + dat = np.frombuffer(message, dtype=np.float32) + mc = (dat.reshape(H//2, W//2) * 128 + 128).astype(np.uint8) + cv2.imshow('model fov', mc) + cv2.waitKey(20) + dat.tofile('/home/batman/c3yuv.img') \ No newline at end of file diff --git a/selfdrive/modeld/SConscript b/selfdrive/modeld/SConscript index 0872b653a9..5293d380b4 100644 --- a/selfdrive/modeld/SConscript +++ b/selfdrive/modeld/SConscript @@ -1,7 +1,7 @@ Import('env', 'arch', 'messaging', 'common', 'gpucommon', 'visionipc') lenv = env.Clone() -libs = [messaging, common, 'OpenCL', 'SNPE', 'capnp', 'zmq', 'kj', 'yuv', gpucommon, visionipc] +libs = [messaging, common, 'OpenCL', 'SNPE', 'capnp', 'zmq', 'czmq', 'kj', 'yuv', gpucommon, visionipc] common_src = [ "models/commonmodel.c", @@ -13,6 +13,9 @@ if arch == "aarch64": libs += ['gsl', 'CB', 'gnustl_shared'] elif arch == "larch64": libs += ['gsl', 'CB', 'symphony-cpu', 'pthread'] + # no screen + lenv['CFLAGS'].append("-DNOSCREEN") + lenv['CXXFLAGS'].append("-DNOSCREEN") else: libs += ['symphony-cpu', 'pthread'] diff --git a/selfdrive/modeld/modeld.cc b/selfdrive/modeld/modeld.cc index 3c5011eb2a..93112aebfb 100644 --- a/selfdrive/modeld/modeld.cc +++ b/selfdrive/modeld/modeld.cc @@ -1,5 +1,6 @@ #include #include +#include #include #include "common/visionbuf.h" @@ -41,11 +42,19 @@ void* live_thread(void *arg) { -1.09890110e-03, 0.00000000e+00, 2.81318681e-01, -1.84808520e-20, 9.00738606e-04,-4.28751576e-02; +#ifndef QCOM2 Eigen::Matrix eon_intrinsics; eon_intrinsics << 910.0, 0.0, 582.0, 0.0, 910.0, 437.0, 0.0, 0.0, 1.0; +#else + Eigen::Matrix eon_intrinsics; + eon_intrinsics << + 1484.0, 0.0, 482.0, + 0.0, 1484.0, 302.0, + 0.0, 0.0, 1.0; +#endif while (!do_exit) { for (auto sock : poller->poll(10)){ @@ -245,6 +254,10 @@ int main(int argc, char **argv) { delete pathplan_sock; delete msg_context; +#ifdef NOSCREEN + zsock_destroy(&model.yuv_sock) +#endif + model_free(&model); LOG("joining live_thread"); diff --git a/selfdrive/modeld/models/driving.cc b/selfdrive/modeld/models/driving.cc index 5aed70ee68..5165cad884 100644 --- a/selfdrive/modeld/models/driving.cc +++ b/selfdrive/modeld/models/driving.cc @@ -42,6 +42,12 @@ void model_init(ModelState* s, cl_device_id device_id, cl_context context, int t s->m = new DefaultRunModel("../../models/supercombo.dlc", s->output, output_size, USE_GPU_RUNTIME); +#ifdef NOSCREEN + zsock_t *yuv_sock = zsock_new_push("tcp://192.168.2.221:7769"); + assert(yuv_sock); + s->yuv_sock = yuv_sock; +#endif + #ifdef TEMPORAL assert(temporal); s->m->addRecurrent(&s->output[OUTPUT_SIZE], TEMPORAL_SIZE); @@ -117,6 +123,13 @@ ModelDataRaw model_eval_frame(ModelState* s, cl_command_queue q, assert(1==2); #endif + #ifdef NOSCREEN + int err, err2; + err = zmq_send(zsock_resolve(s->yuv_sock), new_frame_buf, sizeof(float)*(MODEL_HEIGHT*MODEL_WIDTH*3/2)/6, ZMQ_DONTWAIT); // y1 + err2 = zmq_errno(); + printf("zmq errcode %d, %d\n", err ,err2); + #endif + clEnqueueUnmapMemObject(q, s->frame.net_input, (void*)new_frame_buf, 0, NULL, NULL); // net outputs diff --git a/selfdrive/modeld/models/driving.h b/selfdrive/modeld/models/driving.h index 1a2ac94e1a..d48a067607 100644 --- a/selfdrive/modeld/models/driving.h +++ b/selfdrive/modeld/models/driving.h @@ -63,6 +63,9 @@ typedef struct ModelState { #ifdef TRAFFIC_CONVENTION float *traffic_convention; #endif +#ifdef NOSCREEN + zsock_t *yuv_sock; +#endif } ModelState; void model_init(ModelState* s, cl_device_id device_id, diff --git a/selfdrive/modeld/runners/snpemodel.cc b/selfdrive/modeld/runners/snpemodel.cc index 4bb442d5e1..1785eaf962 100644 --- a/selfdrive/modeld/runners/snpemodel.cc +++ b/selfdrive/modeld/runners/snpemodel.cc @@ -10,7 +10,7 @@ void PrintErrorStringAndExit() { } SNPEModel::SNPEModel(const char *path, float *output, size_t output_size, int runtime) { -#ifdef QCOM +#if defined(QCOM) || defined(QCOM2) zdl::DlSystem::Runtime_t Runtime; if (runtime==USE_GPU_RUNTIME) { Runtime = zdl::DlSystem::Runtime_t::GPU; @@ -33,7 +33,7 @@ SNPEModel::SNPEModel(const char *path, float *output, size_t output_size, int ru // create model runner zdl::SNPE::SNPEBuilder snpeBuilder(container.get()); while (!snpe) { -#ifdef QCOM +#if defined(QCOM) || defined(QCOM2) snpe = snpeBuilder.setOutputLayers({}) .setRuntimeProcessor(Runtime) .setUseUserSuppliedBuffers(true)