@@ -1893,6 +1893,72 @@ static int32_t tmf882x_mode_app_set_calib_data(struct tmf882x_mode_app *app,
18931893 return rc ;
18941894}
18951895
1896+ static bool tmf882x_mode_app_is_shortrange_mode (struct tmf882x_mode_app * app )
1897+ {
1898+ int32_t error = 0 ;
1899+ uint8_t reg = 0 ;
1900+ if (!app ) return false;
1901+
1902+ // register 0x19 is short-range mode state
1903+ // 0x6e: short range
1904+ // 0x6f: long range
1905+ // 0: no short-range support
1906+ error = tof_get_register (priv (app ), 0x19 , & reg );
1907+ if (error ) {
1908+ tof_err (priv (app ), "Error reading shortrange mode register (%d)" , error );
1909+ return false;
1910+ }
1911+
1912+ return (reg == 0x6E );
1913+ }
1914+
1915+ static int32_t tmf882x_mode_app_set_shortrange_mode (struct tmf882x_mode_app * app , bool is_shortrange )
1916+ {
1917+ int32_t rc = 0 ;
1918+ struct tmf882x_mode_app_i2c_msg * i2c_msg ;
1919+ bool capture_state = false;
1920+
1921+ // issue cmd 0x6e -> short range mode
1922+ // issue cmd 0x6f -> long range mode (default)
1923+
1924+ if (is_shortrange == tmf882x_mode_app_is_shortrange_mode (app ))
1925+ return 0 ; // nothing to do, already in correct mode
1926+
1927+ if ((capture_state = is_measuring (app ))) {
1928+ rc = tmf882x_mode_app_stop_measurements (& app -> mode );
1929+ if (rc ) {
1930+ tof_err (priv (app ), "Error (%d) stopping measurements "
1931+ "switching shortrange mode" , rc );
1932+ return -1 ;
1933+ }
1934+ }
1935+
1936+ i2c_msg = to_i2cmsg (app );
1937+ i2c_msg -> cmd = is_shortrange ? 0x6E : 0x6F ;
1938+ i2c_msg -> size = 0 ;
1939+ rc = tmf882x_mode_app_i2c_msg_send_timeout (app , i2c_msg , CMD_DEF_TIMEOUT_MS );
1940+ if (rc ) {
1941+ tof_err (priv (app ), "Error (%d) setting shortrange mode to %u" , rc , is_shortrange );
1942+ return -1 ;
1943+ }
1944+
1945+ // check if the switch was successful
1946+ if (is_shortrange != tmf882x_mode_app_is_shortrange_mode (app )) {
1947+ tof_err (priv (app ), "Error (%d) setting shortrange mode to '%u'" , rc , is_shortrange );
1948+ return -1 ;
1949+ }
1950+
1951+ if (capture_state ) {
1952+ rc = tmf882x_mode_app_start_measurements (& app -> mode );
1953+ if (rc ) {
1954+ tof_err (priv (app ), "Error (%d) re-starting measurements" , rc );
1955+ return -1 ;
1956+ }
1957+ }
1958+
1959+ return 0 ;
1960+ }
1961+
18961962static int32_t tmf882x_mode_app_do_factory_calib (struct tmf882x_mode_app * app ,
18971963 struct tmf882x_mode_app_calib * calib )
18981964{
@@ -2128,6 +2194,13 @@ static int32_t tmf882x_mode_app_ioctl(struct tmf882x_mode *self, uint32_t cmd,
21282194 (* (bool * )output ) = tmf882x_mode_app_is_8x8_mode (app );
21292195 rc = 0 ;
21302196 break ;
2197+ case APP_SET_SHORTRANGE :
2198+ rc = tmf882x_mode_app_set_shortrange_mode (app , (* (bool * )input ));
2199+ break ;
2200+ case APP_IS_SHORTRANGE :
2201+ (* (bool * )output ) = tmf882x_mode_app_is_shortrange_mode (app );
2202+ rc = 0 ;
2203+ break ;
21312204 default :
21322205 tof_err (priv (app ), "Error unhandled IOCTL cmd [%x]" , cmd );
21332206 }
0 commit comments