@@ -43,17 +43,23 @@ struct hid_go_cfg {
4343 struct mutex cfg_mutex ; /*ensure single synchronous output report*/
4444 u8 fps_mode ;
4545 u8 gp_left_auto_sleep_time ;
46+ u8 gp_left_gyro_cal_status ;
47+ u8 gp_left_joy_cal_status ;
4648 u8 gp_left_notify_en ;
4749 u8 gp_left_rumble_mode ;
50+ u8 gp_left_trigg_cal_status ;
4851 u32 gp_left_version_firmware ;
4952 u8 gp_left_version_gen ;
5053 u32 gp_left_version_hardware ;
5154 u32 gp_left_version_product ;
5255 u32 gp_left_version_protocol ;
5356 u8 gp_mode ;
5457 u8 gp_right_auto_sleep_time ;
58+ u8 gp_right_gyro_cal_status ;
59+ u8 gp_right_joy_cal_status ;
5560 u8 gp_right_notify_en ;
5661 u8 gp_right_rumble_mode ;
62+ u8 gp_right_trigg_cal_status ;
5763 u32 gp_right_version_firmware ;
5864 u8 gp_right_version_gen ;
5965 u32 gp_right_version_hardware ;
@@ -227,7 +233,41 @@ static const char *const rumble_mode_text[] = {
227233 [RUMBLE_MODE_RPG ] = "rpg" ,
228234};
229235
230- #define FPS_MODE_DPI 0x02
236+ #define FPS_MODE_DPI 0x02
237+ #define TRIGGER_CALIBRATE 0x04
238+ #define JOYSTICK_CALIBRATE 0x04
239+ #define GYRO_CALIBRATE 0x06
240+
241+ enum cal_device_type {
242+ CALDEV_GYROSCOPE = 0x01 ,
243+ CALDEV_JOYSTICK ,
244+ CALDEV_TRIGGER ,
245+ CALDEV_JOY_TRIGGER ,
246+ };
247+
248+ enum cal_enable {
249+ CAL_UNKNOWN ,
250+ CAL_START ,
251+ CAL_STOP ,
252+ };
253+
254+ static const char * const cal_enabled_text [] = {
255+ [CAL_UNKNOWN ] = "unknown" ,
256+ [CAL_START ] = "start" ,
257+ [CAL_STOP ] = "stop" ,
258+ };
259+
260+ enum cal_status_index {
261+ CAL_STAT_UNKNOWN ,
262+ CAL_STAT_SUCCESS ,
263+ CAL_STAT_FAILURE ,
264+ };
265+
266+ static const char * const cal_status_text [] = {
267+ [CAL_STAT_UNKNOWN ] = "unknown" ,
268+ [CAL_STAT_SUCCESS ] = "success" ,
269+ [CAL_STAT_FAILURE ] = "failure" ,
270+ };
231271
232272enum rgb_config_index {
233273 LIGHT_CFG_ALL = 0x01 ,
@@ -264,6 +304,13 @@ static const char *const rgb_effect_text[] = {
264304 [RGB_EFFECT_RAINBOW ] = "rainbow" ,
265305};
266306
307+ enum device_status_index {
308+ GET_CAL_STATUS = 0x02 ,
309+ GET_UPGRADE_STATUS ,
310+ GET_MACRO_REC_STATUS ,
311+ GET_HOTKEY_TRIGG_STATUS ,
312+ };
313+
267314static int hid_go_version_event (struct command_report * cmd_rep )
268315{
269316 switch (cmd_rep -> sub_cmd ) {
@@ -508,6 +555,44 @@ static int hid_go_light_event(struct command_report *cmd_rep)
508555 }
509556}
510557
558+ static int hid_go_device_status_event (struct command_report * cmd_rep )
559+ {
560+ switch (cmd_rep -> device_type ) {
561+ case LEFT_CONTROLLER :
562+ switch (cmd_rep -> data [0 ]) {
563+ case CALDEV_GYROSCOPE :
564+ drvdata .gp_left_gyro_cal_status = cmd_rep -> data [1 ];
565+ return 0 ;
566+ case CALDEV_JOYSTICK :
567+ drvdata .gp_left_joy_cal_status = cmd_rep -> data [1 ];
568+ return 0 ;
569+ case CALDEV_TRIGGER :
570+ drvdata .gp_left_trigg_cal_status = cmd_rep -> data [1 ];
571+ return 0 ;
572+ default :
573+ return - EINVAL ;
574+ }
575+ break ;
576+ case RIGHT_CONTROLLER :
577+ switch (cmd_rep -> data [0 ]) {
578+ case CALDEV_GYROSCOPE :
579+ drvdata .gp_right_gyro_cal_status = cmd_rep -> data [1 ];
580+ return 0 ;
581+ case CALDEV_JOYSTICK :
582+ drvdata .gp_right_joy_cal_status = cmd_rep -> data [1 ];
583+ return 0 ;
584+ case CALDEV_TRIGGER :
585+ drvdata .gp_right_trigg_cal_status = cmd_rep -> data [1 ];
586+ return 0 ;
587+ default :
588+ return - EINVAL ;
589+ }
590+ break ;
591+ default :
592+ return - EINVAL ;
593+ }
594+ }
595+
511596static int hid_go_set_event_return (struct command_report * cmd_rep )
512597{
513598 if (cmd_rep -> data [0 ] != 0 )
@@ -564,10 +649,16 @@ static int hid_go_raw_event(struct hid_device *hdev, struct hid_report *report,
564649 case GET_RGB_CFG :
565650 ret = hid_go_light_event (cmd_rep );
566651 break ;
652+ case GET_DEVICE_STATUS :
653+ ret = hid_go_device_status_event (cmd_rep );
654+ break ;
567655 case SET_FEATURE_STATUS :
568656 case SET_MOTOR_CFG :
569657 case SET_DPI_CFG :
570658 case SET_RGB_CFG :
659+ case SET_TRIGGER_CFG :
660+ case SET_JOYSTICK_CFG :
661+ case SET_GYRO_CFG :
571662 ret = hid_go_set_event_return (cmd_rep );
572663 break ;
573664 default :
@@ -1152,6 +1243,101 @@ static ssize_t fps_mode_dpi_index_show(struct device *dev,
11521243 return sysfs_emit (buf , "500 800 1200 1800\n" );
11531244}
11541245
1246+ static ssize_t device_status_show (struct device * dev ,
1247+ struct device_attribute * attr , char * buf ,
1248+ enum device_status_index index ,
1249+ enum dev_type device_type ,
1250+ enum cal_device_type cal_type )
1251+ {
1252+ u8 i ;
1253+
1254+ switch (index ) {
1255+ case GET_CAL_STATUS :
1256+ switch (device_type ) {
1257+ case LEFT_CONTROLLER :
1258+ switch (cal_type ) {
1259+ case CALDEV_GYROSCOPE :
1260+ i = drvdata .gp_left_gyro_cal_status ;
1261+ break ;
1262+ case CALDEV_JOYSTICK :
1263+ i = drvdata .gp_left_joy_cal_status ;
1264+ break ;
1265+ case CALDEV_TRIGGER :
1266+ i = drvdata .gp_left_trigg_cal_status ;
1267+ break ;
1268+ default :
1269+ return - EINVAL ;
1270+ }
1271+ break ;
1272+ case RIGHT_CONTROLLER :
1273+ switch (cal_type ) {
1274+ case CALDEV_GYROSCOPE :
1275+ i = drvdata .gp_right_gyro_cal_status ;
1276+ break ;
1277+ case CALDEV_JOYSTICK :
1278+ i = drvdata .gp_right_joy_cal_status ;
1279+ break ;
1280+ case CALDEV_TRIGGER :
1281+ i = drvdata .gp_right_trigg_cal_status ;
1282+ break ;
1283+ default :
1284+ return - EINVAL ;
1285+ }
1286+ break ;
1287+ default :
1288+ return - EINVAL ;
1289+ }
1290+ break ;
1291+ default :
1292+ return - EINVAL ;
1293+ };
1294+
1295+ if (i >= ARRAY_SIZE (cal_status_text ))
1296+ return - EINVAL ;
1297+
1298+ return sysfs_emit (buf , "%s\n" , cal_status_text [i ]);
1299+ }
1300+
1301+ static ssize_t calibrate_config_store (struct device * dev ,
1302+ struct device_attribute * attr ,
1303+ const char * buf , u8 cmd , u8 sub_cmd ,
1304+ size_t count , enum dev_type device_type )
1305+ {
1306+ size_t size = 1 ;
1307+ u8 val = 0 ;
1308+ int ret ;
1309+
1310+ ret = sysfs_match_string (cal_enabled_text , buf );
1311+ if (ret < 0 )
1312+ return ret ;
1313+
1314+ val = ret ;
1315+ if (!val )
1316+ size = 0 ;
1317+
1318+ ret = mcu_property_out (drvdata .hdev , MCU_CONFIG_DATA , cmd , sub_cmd ,
1319+ device_type , & val , size );
1320+ if (ret < 0 )
1321+ return ret ;
1322+
1323+ return count ;
1324+ }
1325+
1326+ static ssize_t calibrate_config_options (struct device * dev ,
1327+ struct device_attribute * attr ,
1328+ char * buf )
1329+ {
1330+ ssize_t count = 0 ;
1331+ unsigned int i ;
1332+
1333+ for (i = 1 ; i < ARRAY_SIZE (cal_enabled_text ); i ++ )
1334+ count += sysfs_emit_at (buf , count , "%s " , cal_enabled_text [i ]);
1335+
1336+ buf [count - 1 ] = '\n' ;
1337+
1338+ return count ;
1339+ }
1340+
11551341static int rgb_cfg_call (struct hid_device * hdev , enum mcu_command_index cmd ,
11561342 enum rgb_config_index index , u8 * val , size_t size )
11571343{
@@ -1458,6 +1644,30 @@ static void hid_go_brightness_set(struct led_classdev *led_cdev,
14581644 } \
14591645 static DEVICE_ATTR_RO_NAMED(_name, _attrname)
14601646
1647+ #define LEGO_CAL_DEVICE_ATTR (_name , _attrname , _scmd , _dtype , _rtype ) \
1648+ static ssize_t _name##_store(struct device *dev, \
1649+ struct device_attribute *attr, \
1650+ const char *buf, size_t count) \
1651+ { \
1652+ return calibrate_config_store(dev, attr, buf, _name.index, \
1653+ _scmd, count, _dtype); \
1654+ } \
1655+ static ssize_t _name##_##_rtype##_show( \
1656+ struct device *dev, struct device_attribute *attr, char *buf) \
1657+ { \
1658+ return calibrate_config_options(dev, attr, buf); \
1659+ } \
1660+ static DEVICE_ATTR_WO_NAMED(_name, _attrname)
1661+
1662+ #define LEGO_DEVICE_STATUS_ATTR (_name , _attrname , _scmd , _dtype ) \
1663+ static ssize_t _name##_show(struct device *dev, \
1664+ struct device_attribute *attr, char *buf) \
1665+ { \
1666+ return device_status_show(dev, attr, buf, _name.index, _scmd, \
1667+ _dtype); \
1668+ } \
1669+ static DEVICE_ATTR_RO_NAMED(_name, _attrname)
1670+
14611671/* Gamepad - MCU */
14621672struct go_cfg_attr version_product_mcu = { PRODUCT_VERSION };
14631673LEGO_DEVICE_ATTR_RO (version_product_mcu , "product_version" , USB_MCU , version );
@@ -1595,9 +1805,45 @@ LEGO_DEVICE_ATTR_RW(rumble_notification_left, "rumble_notification",
15951805static DEVICE_ATTR_RO_NAMED (rumble_notification_left_index ,
15961806 "rumble_notification_index ") ;
15971807
1808+ struct go_cfg_attr cal_trigg_left = { TRIGGER_CALIBRATE };
1809+ LEGO_CAL_DEVICE_ATTR (cal_trigg_left , "calibrate_trigger" , SET_TRIGGER_CFG ,
1810+ LEFT_CONTROLLER , index );
1811+ static DEVICE_ATTR_RO_NAMED (cal_trigg_left_index , "calibrate_trigger_index" );
1812+
1813+ struct go_cfg_attr cal_joy_left = { JOYSTICK_CALIBRATE };
1814+ LEGO_CAL_DEVICE_ATTR (cal_joy_left , "calibrate_joystick" , SET_JOYSTICK_CFG ,
1815+ LEFT_CONTROLLER , index );
1816+ static DEVICE_ATTR_RO_NAMED (cal_joy_left_index , "calibrate_joystick_index" );
1817+
1818+ struct go_cfg_attr cal_gyro_left = { GYRO_CALIBRATE };
1819+ LEGO_CAL_DEVICE_ATTR (cal_gyro_left , "calibrate_gyro" , SET_GYRO_CFG ,
1820+ LEFT_CONTROLLER , index );
1821+ static DEVICE_ATTR_RO_NAMED (cal_gyro_left_index , "calibrate_gyro_index" );
1822+
1823+ struct go_cfg_attr cal_trigg_left_status = { GET_CAL_STATUS };
1824+ LEGO_DEVICE_STATUS_ATTR (cal_trigg_left_status , "calibrate_trigger_status" ,
1825+ LEFT_CONTROLLER , CALDEV_TRIGGER );
1826+
1827+ struct go_cfg_attr cal_joy_left_status = { GET_CAL_STATUS };
1828+ LEGO_DEVICE_STATUS_ATTR (cal_joy_left_status , "calibrate_joystick_status" ,
1829+ LEFT_CONTROLLER , CALDEV_JOYSTICK );
1830+
1831+ struct go_cfg_attr cal_gyro_left_status = { GET_CAL_STATUS };
1832+ LEGO_DEVICE_STATUS_ATTR (cal_gyro_left_status , "calibrate_gyro_status" ,
1833+ LEFT_CONTROLLER , CALDEV_GYROSCOPE );
1834+
15981835static struct attribute * left_gamepad_attrs [] = {
15991836 & dev_attr_auto_sleep_time_left .attr ,
16001837 & dev_attr_auto_sleep_time_left_range .attr ,
1838+ & dev_attr_cal_gyro_left .attr ,
1839+ & dev_attr_cal_gyro_left_index .attr ,
1840+ & dev_attr_cal_gyro_left_status .attr ,
1841+ & dev_attr_cal_joy_left .attr ,
1842+ & dev_attr_cal_joy_left_index .attr ,
1843+ & dev_attr_cal_joy_left_status .attr ,
1844+ & dev_attr_cal_trigg_left .attr ,
1845+ & dev_attr_cal_trigg_left_index .attr ,
1846+ & dev_attr_cal_trigg_left_status .attr ,
16011847 & dev_attr_imu_bypass_left .attr ,
16021848 & dev_attr_imu_bypass_left_index .attr ,
16031849 & dev_attr_imu_enabled_left .attr ,
@@ -1666,9 +1912,45 @@ LEGO_DEVICE_ATTR_RW(rumble_notification_right, "rumble_notification",
16661912static DEVICE_ATTR_RO_NAMED (rumble_notification_right_index ,
16671913 "rumble_notification_index ") ;
16681914
1915+ struct go_cfg_attr cal_trigg_right = { TRIGGER_CALIBRATE };
1916+ LEGO_CAL_DEVICE_ATTR (cal_trigg_right , "calibrate_trigger" , SET_TRIGGER_CFG ,
1917+ RIGHT_CONTROLLER , index );
1918+ static DEVICE_ATTR_RO_NAMED (cal_trigg_right_index , "calibrate_trigger_index" );
1919+
1920+ struct go_cfg_attr cal_joy_right = { JOYSTICK_CALIBRATE };
1921+ LEGO_CAL_DEVICE_ATTR (cal_joy_right , "calibrate_joystick" , SET_JOYSTICK_CFG ,
1922+ RIGHT_CONTROLLER , index );
1923+ static DEVICE_ATTR_RO_NAMED (cal_joy_right_index , "calibrate_joystick_index" );
1924+
1925+ struct go_cfg_attr cal_gyro_right = { GYRO_CALIBRATE };
1926+ LEGO_CAL_DEVICE_ATTR (cal_gyro_right , "calibrate_gyro" , SET_GYRO_CFG ,
1927+ RIGHT_CONTROLLER , index );
1928+ static DEVICE_ATTR_RO_NAMED (cal_gyro_right_index , "calibrate_gyro_index ") ;
1929+
1930+ struct go_cfg_attr cal_trigg_right_status = { GET_CAL_STATUS };
1931+ LEGO_DEVICE_STATUS_ATTR (cal_trigg_right_status , "calibrate_trigger_status" ,
1932+ RIGHT_CONTROLLER , CALDEV_TRIGGER );
1933+
1934+ struct go_cfg_attr cal_joy_right_status = { GET_CAL_STATUS };
1935+ LEGO_DEVICE_STATUS_ATTR (cal_joy_right_status , "calibrate_joystick_status" ,
1936+ RIGHT_CONTROLLER , CALDEV_JOYSTICK );
1937+
1938+ struct go_cfg_attr cal_gyro_right_status = { GET_CAL_STATUS };
1939+ LEGO_DEVICE_STATUS_ATTR (cal_gyro_right_status , "calibrate_gyro_status" ,
1940+ RIGHT_CONTROLLER , CALDEV_GYROSCOPE );
1941+
16691942static struct attribute * right_gamepad_attrs [] = {
16701943 & dev_attr_auto_sleep_time_right .attr ,
16711944 & dev_attr_auto_sleep_time_right_range .attr ,
1945+ & dev_attr_cal_gyro_right .attr ,
1946+ & dev_attr_cal_gyro_right_index .attr ,
1947+ & dev_attr_cal_gyro_right_status .attr ,
1948+ & dev_attr_cal_joy_right .attr ,
1949+ & dev_attr_cal_joy_right_index .attr ,
1950+ & dev_attr_cal_joy_right_status .attr ,
1951+ & dev_attr_cal_trigg_right .attr ,
1952+ & dev_attr_cal_trigg_right_index .attr ,
1953+ & dev_attr_cal_trigg_right_status .attr ,
16721954 & dev_attr_imu_bypass_right .attr ,
16731955 & dev_attr_imu_bypass_right_index .attr ,
16741956 & dev_attr_imu_enabled_right .attr ,
0 commit comments