diff --git a/selfdrive/camerad/cameras/camera_qcom.cc b/selfdrive/camerad/cameras/camera_qcom.cc index 7b350215d1..78514b798a 100644 --- a/selfdrive/camerad/cameras/camera_qcom.cc +++ b/selfdrive/camerad/cameras/camera_qcom.cc @@ -32,7 +32,7 @@ const uint16_t INFINITY_DAC = 364; extern ExitHandler do_exit; static int cam_ioctl(int fd, unsigned long int request, void *arg, const char *log_msg = nullptr) { - int err = ioctl(fd, request, arg); + int err = HANDLE_EINTR(ioctl(fd, request, arg)); if (err != 0 && log_msg) { LOG(util::string_format("%s: %d", log_msg, err).c_str()); } @@ -82,7 +82,7 @@ static void camera_release_buffer(void* cookie, int buf_idx) { CameraState *s = (CameraState *)cookie; // printf("camera_release_buffer %d\n", buf_idx); s->ss[0].qbuf_info[buf_idx].dirty_buf = 1; - ioctl(s->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &s->ss[0].qbuf_info[buf_idx]); + HANDLE_EINTR(ioctl(s->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &s->ss[0].qbuf_info[buf_idx])); } int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size_t size, msm_camera_i2c_data_type data_type) { @@ -94,7 +94,7 @@ int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size .delay = 0, }; sensorb_cfg_data cfg_data = {.cfgtype = CFG_WRITE_I2C_ARRAY, .cfg.setting = &out_settings}; - return ioctl(s->sensor_fd, VIDIOC_MSM_SENSOR_CFG, &cfg_data); + return HANDLE_EINTR(ioctl(s->sensor_fd, VIDIOC_MSM_SENSOR_CFG, &cfg_data)); } static int imx298_apply_exposure(CameraState *s, int gain, int integ_lines, uint32_t frame_length) { @@ -797,7 +797,7 @@ void actuator_move(CameraState *s, uint16_t target) { .curr_lens_pos = s->cur_lens_pos, .ringing_params = &actuator_ringing_params, }; - ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data); + HANDLE_EINTR(ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data)); s->cur_step_pos = dest_step_pos; s->cur_lens_pos = actuator_cfg_data.cfg.move.curr_lens_pos; @@ -962,7 +962,7 @@ void cameras_open(MultiCameraState *s) { // ISPIF: set vfe info struct ispif_cfg_data ispif_cfg_data = {.cfg_type = ISPIF_SET_VFE_INFO, .vfe_info.num_vfe = 2}; - int err = ioctl(s->ispif_fd, VIDIOC_MSM_ISPIF_CFG, &ispif_cfg_data); + int err = HANDLE_EINTR(ioctl(s->ispif_fd, VIDIOC_MSM_ISPIF_CFG, &ispif_cfg_data)); LOG("ispif set vfe info: %d", err); // ISPIF: setup @@ -1142,7 +1142,7 @@ void cameras_run(MultiCameraState *s) { CameraState *c = cameras[i]; struct v4l2_event ev = {}; - ret = ioctl(c->isp_fd, VIDIOC_DQEVENT, &ev); + ret = HANDLE_EINTR(ioctl(c->isp_fd, VIDIOC_DQEVENT, &ev)); const msm_isp_event_data *isp_event_data = (const msm_isp_event_data *)ev.u.data; if (ev.type == ISP_EVENT_BUF_DIVERT) { @@ -1157,7 +1157,7 @@ void cameras_run(MultiCameraState *s) { parse_autofocus(c, (uint8_t *)(ss.bufs[buf_idx].addr)); } ss.qbuf_info[buf_idx].dirty_buf = 1; - ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &ss.qbuf_info[buf_idx]); + HANDLE_EINTR(ioctl(c->isp_fd, VIDIOC_MSM_ISP_ENQUEUE_BUF, &ss.qbuf_info[buf_idx])); } } else if (ev.type == ISP_EVENT_EOF) { diff --git a/selfdrive/camerad/cameras/camera_qcom2.cc b/selfdrive/camerad/cameras/camera_qcom2.cc index b94b624ad0..5175238b9f 100644 --- a/selfdrive/camerad/cameras/camera_qcom2.cc +++ b/selfdrive/camerad/cameras/camera_qcom2.cc @@ -68,7 +68,7 @@ int cam_control(int fd, int op_code, void *handle, int size) { camcontrol.handle_type = CAM_HANDLE_USER_POINTER; } - int ret = ioctl(fd, VIDIOC_CAM_CONTROL, &camcontrol); + int ret = HANDLE_EINTR(ioctl(fd, VIDIOC_CAM_CONTROL, &camcontrol)); if (ret == -1) { printf("OP CODE ERR - %d \n", op_code); perror("wat"); @@ -818,7 +818,7 @@ void cameras_open(MultiCameraState *s) { static struct v4l2_event_subscription sub = {0}; sub.type = V4L_EVENT_CAM_REQ_MGR_EVENT; sub.id = 2; // should use boot time for sof - ret = ioctl(s->video0_fd, VIDIOC_SUBSCRIBE_EVENT, &sub); + ret = HANDLE_EINTR(ioctl(s->video0_fd, VIDIOC_SUBSCRIBE_EVENT, &sub)); printf("req mgr subscribe: %d\n", ret); camera_open(&s->road_cam); @@ -1102,22 +1102,26 @@ void cameras_run(MultiCameraState *s) { if (!fds[0].revents) continue; struct v4l2_event ev = {0}; - ret = ioctl(fds[0].fd, VIDIOC_DQEVENT, &ev); - if (ev.type == V4L_EVENT_CAM_REQ_MGR_EVENT) { - struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)ev.u.data; - // LOGD("v4l2 event: sess_hdl %d, link_hdl %d, frame_id %d, req_id %lld, timestamp 0x%llx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status); - // printf("sess_hdl %d, link_hdl %d, frame_id %lu, req_id %lu, timestamp 0x%lx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status); - - if (event_data->session_hdl == s->road_cam.session_handle) { - handle_camera_event(&s->road_cam, event_data); - } else if (event_data->session_hdl == s->wide_road_cam.session_handle) { - handle_camera_event(&s->wide_road_cam, event_data); - } else if (event_data->session_hdl == s->driver_cam.session_handle) { - handle_camera_event(&s->driver_cam, event_data); - } else { - printf("Unknown vidioc event source\n"); - assert(false); + ret = HANDLE_EINTR(ioctl(fds[0].fd, VIDIOC_DQEVENT, &ev)); + if (ret == 0) { + if (ev.type == V4L_EVENT_CAM_REQ_MGR_EVENT) { + struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)ev.u.data; + // LOGD("v4l2 event: sess_hdl %d, link_hdl %d, frame_id %d, req_id %lld, timestamp 0x%llx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status); + // printf("sess_hdl %d, link_hdl %d, frame_id %lu, req_id %lu, timestamp 0x%lx, sof_status %d\n", event_data->session_hdl, event_data->u.frame_msg.link_hdl, event_data->u.frame_msg.frame_id, event_data->u.frame_msg.request_id, event_data->u.frame_msg.timestamp, event_data->u.frame_msg.sof_status); + + if (event_data->session_hdl == s->road_cam.session_handle) { + handle_camera_event(&s->road_cam, event_data); + } else if (event_data->session_hdl == s->wide_road_cam.session_handle) { + handle_camera_event(&s->wide_road_cam, event_data); + } else if (event_data->session_hdl == s->driver_cam.session_handle) { + handle_camera_event(&s->driver_cam, event_data); + } else { + printf("Unknown vidioc event source\n"); + assert(false); + } } + } else { + LOGE("VIDIOC_DQEVENT failed, errno=%d", errno); } } diff --git a/selfdrive/common/i2c.cc b/selfdrive/common/i2c.cc index 80738be801..9734caad31 100644 --- a/selfdrive/common/i2c.cc +++ b/selfdrive/common/i2c.cc @@ -9,6 +9,7 @@ #include #include "selfdrive/common/swaglog.h" +#include "selfdrive/common/util.h" #define UNUSED(x) (void)(x) @@ -36,7 +37,7 @@ I2CBus::~I2CBus() { int I2CBus::read_register(uint8_t device_address, uint register_address, uint8_t *buffer, uint8_t len) { int ret = 0; - ret = ioctl(i2c_fd, I2C_SLAVE, device_address); + ret = HANDLE_EINTR(ioctl(i2c_fd, I2C_SLAVE, device_address)); if(ret < 0) { goto fail; } ret = i2c_smbus_read_i2c_block_data(i2c_fd, register_address, len, buffer); @@ -49,7 +50,7 @@ fail: int I2CBus::set_register(uint8_t device_address, uint register_address, uint8_t data) { int ret = 0; - ret = ioctl(i2c_fd, I2C_SLAVE, device_address); + ret = HANDLE_EINTR(ioctl(i2c_fd, I2C_SLAVE, device_address)); if(ret < 0) { goto fail; } ret = i2c_smbus_write_byte_data(i2c_fd, register_address, data); diff --git a/selfdrive/common/params.cc b/selfdrive/common/params.cc index 79f5f82cf2..81e1e5c028 100644 --- a/selfdrive/common/params.cc +++ b/selfdrive/common/params.cc @@ -20,17 +20,6 @@ #include "selfdrive/common/util.h" #include "selfdrive/hardware/hw.h" -// keep trying if x gets interrupted by a signal -#define HANDLE_EINTR(x) \ - ({ \ - decltype(x) ret; \ - int try_cnt = 0; \ - do { \ - ret = (x); \ - } while (ret == -1 && errno == EINTR && try_cnt++ < 100); \ - ret; \ - }) - namespace { volatile sig_atomic_t params_do_exit = 0; diff --git a/selfdrive/common/util.h b/selfdrive/common/util.h index b0cd9ebb02..f9a244bc6a 100644 --- a/selfdrive/common/util.h +++ b/selfdrive/common/util.h @@ -13,6 +13,17 @@ #include #include +// keep trying if x gets interrupted by a signal +#define HANDLE_EINTR(x) \ + ({ \ + decltype(x) ret; \ + int try_cnt = 0; \ + do { \ + ret = (x); \ + } while (ret == -1 && errno == EINTR && try_cnt++ < 100); \ + ret; \ + }) + #ifndef sighandler_t typedef void (*sighandler_t)(int sig); #endif diff --git a/selfdrive/modeld/thneed/thneed.cc b/selfdrive/modeld/thneed/thneed.cc index 89fdfe3910..98212ea09a 100644 --- a/selfdrive/modeld/thneed/thneed.cc +++ b/selfdrive/modeld/thneed/thneed.cc @@ -11,6 +11,7 @@ #include "selfdrive/common/clutil.h" #include "selfdrive/common/timing.h" +#include "selfdrive/common/util.h" //#define RUN_DISASSEMBLER //#define RUN_OPTIMIZER @@ -112,7 +113,7 @@ int ioctl(int filedes, unsigned long request, void *argp) { } } - int ret = my_ioctl(filedes, request, argp); + int ret = HANDLE_EINTR(my_ioctl(filedes, request, argp)); if (ret != 0) printf("ioctl returned %d with errno %d\n", ret, errno); return ret; }