Lines Matching full:ds

627 static int dualsense_get_calibration_data(struct dualsense *ds)  in dualsense_get_calibration_data()  argument
645 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_CALIBRATION, buf, in dualsense_get_calibration_data()
648 hid_err(ds->base.hdev, "Failed to retrieve DualSense calibration info: %d\n", ret); in dualsense_get_calibration_data()
675 ds->gyro_calib_data[0].abs_code = ABS_RX; in dualsense_get_calibration_data()
676 ds->gyro_calib_data[0].bias = gyro_pitch_bias; in dualsense_get_calibration_data()
677 ds->gyro_calib_data[0].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
678 ds->gyro_calib_data[0].sens_denom = gyro_pitch_plus - gyro_pitch_minus; in dualsense_get_calibration_data()
680 ds->gyro_calib_data[1].abs_code = ABS_RY; in dualsense_get_calibration_data()
681 ds->gyro_calib_data[1].bias = gyro_yaw_bias; in dualsense_get_calibration_data()
682 ds->gyro_calib_data[1].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
683 ds->gyro_calib_data[1].sens_denom = gyro_yaw_plus - gyro_yaw_minus; in dualsense_get_calibration_data()
685 ds->gyro_calib_data[2].abs_code = ABS_RZ; in dualsense_get_calibration_data()
686 ds->gyro_calib_data[2].bias = gyro_roll_bias; in dualsense_get_calibration_data()
687 ds->gyro_calib_data[2].sens_numer = speed_2x*DS_GYRO_RES_PER_DEG_S; in dualsense_get_calibration_data()
688 ds->gyro_calib_data[2].sens_denom = gyro_roll_plus - gyro_roll_minus; in dualsense_get_calibration_data()
695 ds->accel_calib_data[0].abs_code = ABS_X; in dualsense_get_calibration_data()
696 ds->accel_calib_data[0].bias = acc_x_plus - range_2g / 2; in dualsense_get_calibration_data()
697 ds->accel_calib_data[0].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
698 ds->accel_calib_data[0].sens_denom = range_2g; in dualsense_get_calibration_data()
701 ds->accel_calib_data[1].abs_code = ABS_Y; in dualsense_get_calibration_data()
702 ds->accel_calib_data[1].bias = acc_y_plus - range_2g / 2; in dualsense_get_calibration_data()
703 ds->accel_calib_data[1].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
704 ds->accel_calib_data[1].sens_denom = range_2g; in dualsense_get_calibration_data()
707 ds->accel_calib_data[2].abs_code = ABS_Z; in dualsense_get_calibration_data()
708 ds->accel_calib_data[2].bias = acc_z_plus - range_2g / 2; in dualsense_get_calibration_data()
709 ds->accel_calib_data[2].sens_numer = 2*DS_ACC_RES_PER_G; in dualsense_get_calibration_data()
710 ds->accel_calib_data[2].sens_denom = range_2g; in dualsense_get_calibration_data()
717 static int dualsense_get_firmware_info(struct dualsense *ds) in dualsense_get_firmware_info() argument
726 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_FIRMWARE_INFO, buf, in dualsense_get_firmware_info()
729 hid_err(ds->base.hdev, "Failed to retrieve DualSense firmware info: %d\n", ret); in dualsense_get_firmware_info()
733 ds->base.hw_version = get_unaligned_le32(&buf[24]); in dualsense_get_firmware_info()
734 ds->base.fw_version = get_unaligned_le32(&buf[28]); in dualsense_get_firmware_info()
741 static int dualsense_get_mac_address(struct dualsense *ds) in dualsense_get_mac_address() argument
750 ret = ps_get_report(ds->base.hdev, DS_FEATURE_REPORT_PAIRING_INFO, buf, in dualsense_get_mac_address()
753 hid_err(ds->base.hdev, "Failed to retrieve DualSense pairing info: %d\n", ret); in dualsense_get_mac_address()
757 memcpy(ds->base.mac_address, &buf[1], sizeof(ds->base.mac_address)); in dualsense_get_mac_address()
764 static void dualsense_init_output_report(struct dualsense *ds, struct dualsense_output_report *rp, in dualsense_init_output_report() argument
767 struct hid_device *hdev = ds->base.hdev; in dualsense_init_output_report()
780 bt->seq_tag = (ds->output_seq << 4) | 0x0; in dualsense_init_output_report()
781 if (++ds->output_seq == 16) in dualsense_init_output_report()
782 ds->output_seq = 0; in dualsense_init_output_report()
807 static void dualsense_send_output_report(struct dualsense *ds, in dualsense_send_output_report() argument
810 struct hid_device *hdev = ds->base.hdev; in dualsense_send_output_report()
828 struct dualsense *ds = container_of(work, struct dualsense, output_worker); in dualsense_output_worker() local
833 dualsense_init_output_report(ds, &report, ds->output_report_dmabuf); in dualsense_output_worker()
836 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_output_worker()
838 if (ds->update_rumble) { in dualsense_output_worker()
842 common->motor_left = ds->motor_left; in dualsense_output_worker()
843 common->motor_right = ds->motor_right; in dualsense_output_worker()
844 ds->update_rumble = false; in dualsense_output_worker()
847 if (ds->update_lightbar) { in dualsense_output_worker()
849 common->lightbar_red = ds->lightbar_red; in dualsense_output_worker()
850 common->lightbar_green = ds->lightbar_green; in dualsense_output_worker()
851 common->lightbar_blue = ds->lightbar_blue; in dualsense_output_worker()
853 ds->update_lightbar = false; in dualsense_output_worker()
856 if (ds->update_player_leds) { in dualsense_output_worker()
858 common->player_leds = ds->player_leds_state; in dualsense_output_worker()
860 ds->update_player_leds = false; in dualsense_output_worker()
863 if (ds->update_mic_mute) { in dualsense_output_worker()
865 common->mute_button_led = ds->mic_muted; in dualsense_output_worker()
867 if (ds->mic_muted) { in dualsense_output_worker()
877 ds->update_mic_mute = false; in dualsense_output_worker()
880 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_output_worker()
882 dualsense_send_output_report(ds, &report); in dualsense_output_worker()
889 struct dualsense *ds = container_of(ps_dev, struct dualsense, base); in dualsense_parse_report() local
922 input_report_abs(ds->gamepad, ABS_X, ds_report->x); in dualsense_parse_report()
923 input_report_abs(ds->gamepad, ABS_Y, ds_report->y); in dualsense_parse_report()
924 input_report_abs(ds->gamepad, ABS_RX, ds_report->rx); in dualsense_parse_report()
925 input_report_abs(ds->gamepad, ABS_RY, ds_report->ry); in dualsense_parse_report()
926 input_report_abs(ds->gamepad, ABS_Z, ds_report->z); in dualsense_parse_report()
927 input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz); in dualsense_parse_report()
932 input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x); in dualsense_parse_report()
933 input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y); in dualsense_parse_report()
935 input_report_key(ds->gamepad, BTN_WEST, ds_report->buttons[0] & DS_BUTTONS0_SQUARE); in dualsense_parse_report()
936 input_report_key(ds->gamepad, BTN_SOUTH, ds_report->buttons[0] & DS_BUTTONS0_CROSS); in dualsense_parse_report()
937 input_report_key(ds->gamepad, BTN_EAST, ds_report->buttons[0] & DS_BUTTONS0_CIRCLE); in dualsense_parse_report()
938 input_report_key(ds->gamepad, BTN_NORTH, ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE); in dualsense_parse_report()
939 input_report_key(ds->gamepad, BTN_TL, ds_report->buttons[1] & DS_BUTTONS1_L1); in dualsense_parse_report()
940 input_report_key(ds->gamepad, BTN_TR, ds_report->buttons[1] & DS_BUTTONS1_R1); in dualsense_parse_report()
941 input_report_key(ds->gamepad, BTN_TL2, ds_report->buttons[1] & DS_BUTTONS1_L2); in dualsense_parse_report()
942 input_report_key(ds->gamepad, BTN_TR2, ds_report->buttons[1] & DS_BUTTONS1_R2); in dualsense_parse_report()
943 input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE); in dualsense_parse_report()
944 input_report_key(ds->gamepad, BTN_START, ds_report->buttons[1] & DS_BUTTONS1_OPTIONS); in dualsense_parse_report()
945 input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3); in dualsense_parse_report()
946 input_report_key(ds->gamepad, BTN_THUMBR, ds_report->buttons[1] & DS_BUTTONS1_R3); in dualsense_parse_report()
947 input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME); in dualsense_parse_report()
948 input_sync(ds->gamepad); in dualsense_parse_report()
956 if (btn_mic_state && !ds->last_btn_mic_state) { in dualsense_parse_report()
958 ds->update_mic_mute = true; in dualsense_parse_report()
959 ds->mic_muted = !ds->mic_muted; /* toggle */ in dualsense_parse_report()
963 schedule_work(&ds->output_worker); in dualsense_parse_report()
965 ds->last_btn_mic_state = btn_mic_state; in dualsense_parse_report()
970 int calib_data = mult_frac(ds->gyro_calib_data[i].sens_numer, in dualsense_parse_report()
971 raw_data - ds->gyro_calib_data[i].bias, in dualsense_parse_report()
972 ds->gyro_calib_data[i].sens_denom); in dualsense_parse_report()
974 input_report_abs(ds->sensors, ds->gyro_calib_data[i].abs_code, calib_data); in dualsense_parse_report()
980 int calib_data = mult_frac(ds->accel_calib_data[i].sens_numer, in dualsense_parse_report()
981 raw_data - ds->accel_calib_data[i].bias, in dualsense_parse_report()
982 ds->accel_calib_data[i].sens_denom); in dualsense_parse_report()
984 input_report_abs(ds->sensors, ds->accel_calib_data[i].abs_code, calib_data); in dualsense_parse_report()
989 if (!ds->sensor_timestamp_initialized) { in dualsense_parse_report()
990 ds->sensor_timestamp_us = DIV_ROUND_CLOSEST(sensor_timestamp, 3); in dualsense_parse_report()
991 ds->sensor_timestamp_initialized = true; in dualsense_parse_report()
995 if (ds->prev_sensor_timestamp > sensor_timestamp) in dualsense_parse_report()
996 delta = (U32_MAX - ds->prev_sensor_timestamp + sensor_timestamp + 1); in dualsense_parse_report()
998 delta = sensor_timestamp - ds->prev_sensor_timestamp; in dualsense_parse_report()
999 ds->sensor_timestamp_us += DIV_ROUND_CLOSEST(delta, 3); in dualsense_parse_report()
1001 ds->prev_sensor_timestamp = sensor_timestamp; in dualsense_parse_report()
1002 input_event(ds->sensors, EV_MSC, MSC_TIMESTAMP, ds->sensor_timestamp_us); in dualsense_parse_report()
1003 input_sync(ds->sensors); in dualsense_parse_report()
1009 input_mt_slot(ds->touchpad, i); in dualsense_parse_report()
1010 input_mt_report_slot_state(ds->touchpad, MT_TOOL_FINGER, active); in dualsense_parse_report()
1016 input_report_abs(ds->touchpad, ABS_MT_POSITION_X, x); in dualsense_parse_report()
1017 input_report_abs(ds->touchpad, ABS_MT_POSITION_Y, y); in dualsense_parse_report()
1020 input_mt_sync_frame(ds->touchpad); in dualsense_parse_report()
1021 input_report_key(ds->touchpad, BTN_LEFT, ds_report->buttons[2] & DS_BUTTONS2_TOUCHPAD); in dualsense_parse_report()
1022 input_sync(ds->touchpad); in dualsense_parse_report()
1066 struct dualsense *ds = hid_get_drvdata(hdev); in dualsense_play_effect() local
1072 spin_lock_irqsave(&ds->base.lock, flags); in dualsense_play_effect()
1073 ds->update_rumble = true; in dualsense_play_effect()
1074 ds->motor_left = effect->u.rumble.strong_magnitude / 256; in dualsense_play_effect()
1075 ds->motor_right = effect->u.rumble.weak_magnitude / 256; in dualsense_play_effect()
1076 spin_unlock_irqrestore(&ds->base.lock, flags); in dualsense_play_effect()
1078 schedule_work(&ds->output_worker); in dualsense_play_effect()
1082 static int dualsense_reset_leds(struct dualsense *ds) in dualsense_reset_leds() argument
1091 dualsense_init_output_report(ds, &report, buf); in dualsense_reset_leds()
1101 dualsense_send_output_report(ds, &report); in dualsense_reset_leds()
1107 static void dualsense_set_lightbar(struct dualsense *ds, uint8_t red, uint8_t green, uint8_t blue) in dualsense_set_lightbar() argument
1109 ds->update_lightbar = true; in dualsense_set_lightbar()
1110 ds->lightbar_red = red; in dualsense_set_lightbar()
1111 ds->lightbar_green = green; in dualsense_set_lightbar()
1112 ds->lightbar_blue = blue; in dualsense_set_lightbar()
1114 schedule_work(&ds->output_worker); in dualsense_set_lightbar()
1117 static void dualsense_set_player_leds(struct dualsense *ds) in dualsense_set_player_leds() argument
1133 uint8_t player_id = ds->base.player_id % ARRAY_SIZE(player_ids); in dualsense_set_player_leds()
1135 ds->update_player_leds = true; in dualsense_set_player_leds()
1136 ds->player_leds_state = player_ids[player_id]; in dualsense_set_player_leds()
1137 schedule_work(&ds->output_worker); in dualsense_set_player_leds()
1142 struct dualsense *ds; in dualsense_create() local
1147 ds = devm_kzalloc(&hdev->dev, sizeof(*ds), GFP_KERNEL); in dualsense_create()
1148 if (!ds) in dualsense_create()
1157 ps_dev = &ds->base; in dualsense_create()
1163 INIT_WORK(&ds->output_worker, dualsense_output_worker); in dualsense_create()
1164 hid_set_drvdata(hdev, ds); in dualsense_create()
1167 ds->output_report_dmabuf = devm_kzalloc(&hdev->dev, max_output_report_size, GFP_KERNEL); in dualsense_create()
1168 if (!ds->output_report_dmabuf) in dualsense_create()
1171 ret = dualsense_get_mac_address(ds); in dualsense_create()
1176 snprintf(hdev->uniq, sizeof(hdev->uniq), "%pMR", ds->base.mac_address); in dualsense_create()
1178 ret = dualsense_get_firmware_info(ds); in dualsense_create()
1188 ret = dualsense_get_calibration_data(ds); in dualsense_create()
1194 ds->gamepad = ps_gamepad_create(hdev, dualsense_play_effect); in dualsense_create()
1195 if (IS_ERR(ds->gamepad)) { in dualsense_create()
1196 ret = PTR_ERR(ds->gamepad); in dualsense_create()
1200 ds->sensors = ps_sensors_create(hdev, DS_ACC_RANGE, DS_ACC_RES_PER_G, in dualsense_create()
1202 if (IS_ERR(ds->sensors)) { in dualsense_create()
1203 ret = PTR_ERR(ds->sensors); in dualsense_create()
1207 ds->touchpad = ps_touchpad_create(hdev, DS_TOUCHPAD_WIDTH, DS_TOUCHPAD_HEIGHT, 2); in dualsense_create()
1208 if (IS_ERR(ds->touchpad)) { in dualsense_create()
1209 ret = PTR_ERR(ds->touchpad); in dualsense_create()
1222 ret = dualsense_reset_leds(ds); in dualsense_create()
1226 dualsense_set_lightbar(ds, 0, 0, 128); /* blue */ in dualsense_create()
1235 dualsense_set_player_leds(ds); in dualsense_create()
1242 ds->base.hw_version, ds->base.fw_version); in dualsense_create()
1244 return &ds->base; in dualsense_create()