Re: Getting error "failed to setup attributes" on Adding Custom Fields in accelerometer HID driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Do I need to define the all the Usage Tags in the input report of a sensor to retrieve minimum any one field or Only a Usage Tag which I wanted to retrieve is enough.
e.g for an input report of an accelerometer which has the below fields(added new one in Bold),

HID_USAGE_SENSOR_ACCEL_X_AXIS
HID_USAGE_SENSOR_ACCEL_Y_AXIS
HID_USAGE_SENSOR_ACCEL_Z_AXIS
HID_USAGE_SENSOR_DATA_MOTION_STATE,
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_4

 I want to retrieve Custom_Value_4 do I also need to define parameters for Data_Motion_state, Custom_Value2,Custom_Value3 as well apart from Custom_Value4 in the below structure.

enum accel_3d_channel {.. }
struct accel_3d_state {.. }
static const struct iio_chan_spec accel_3d_channels[] = { ..}

I did so but was getting error - "failed to setup attributes" but after I modified the code in the function : accel_3d_parse_report() like below to accommodate all the non Contigous Usage Tags and associated them with their channels - *_SCAN_INDEX_* .  I did not get this error but some other error (listed at the end of the mail)


//First Three channel X,Y and Z whose Usage Tags are contionus - 0x200453/54/55
for (i = 0; i <= CHANNEL_SCAN_INDEX_Z; ++i) {
                  
ret = sensor_hub_input_get_attribute_info(hsdev,
HID_INPUT_REPORT,
usage_id,
HID_USAGE_SENSOR_ACCEL_X_AXIS + i,
&st->accel[CHANNEL_SCAN_INDEX_X + i]);     
          accel_3d_adjust_channel_bit_mask(channels,
CHANNEL_SCAN_INDEX_X + i,
st->accel[CHANNEL_SCAN_INDEX_X + i].size);
}

//Fourth channel For Data Motion - 0x200451
ret = sensor_hub_input_get_attribute_info(hsdev,
HID_INPUT_REPORT,
usage_id,
HID_USAGE_SENSOR_DATA_MOTION_STATE, // For CHANNEL_SCAN_DATA_MOTION
&st->accel[CHANNEL_SCAN_INDEX_X + i]);
accel_3d_adjust_channel_bit_mask(channels,
CHANNEL_SCAN_INDEX_X + i,
st->accel[CHANNEL_SCAN_INDEX_X + i].size);

//Last Three Channel for Custom Value 2,3,4 - 0x200545/46/47
for (i = 0; i <= 2; ++i) {

ret = sensor_hub_input_get_attribute_info(hsdev,
HID_INPUT_REPORT,
usage_id,
HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2 + i,
&st->accel[CHANNEL_SCAN_INDEX_X + i + 4]); //start after CHANNEL_SCAN_DATA_MOTION Channel
accel_3d_adjust_channel_bit_mask(channels,
CHANNEL_SCAN_INDEX_X + i + 4,
st->accel[CHANNEL_SCAN_INDEX_X + i].size);
}



But now I am getting a different error : 

[13778.127716] iio iio:device4: tried to double register : in_accel_x_index
[13778.127899] hid_sensor_accel_3d HID-SENSOR-200073.3.auto: failed to initialize trigger buffer
[13778.143676] hid_sensor_accel_3d: probe of HID-SENSOR-200073.3.auto failed with error -16

I am still figuring out where else Do I have to modify the code in order to receive the above custom values ..
Thanks,
S



On Thu, Feb 26, 2015 at 6:54 PM, Daniel Baluta <daniel.baluta@xxxxxxxxx> wrote:
+ linux-iio list.

On Thu, Feb 26, 2015 at 8:04 AM, s.rawat <imsaurabhrawat@xxxxxxxxx> wrote:
> I have modified the hid-sensor-accel_3d.c driver to add the custom fields -
> CHANNEL_SCAN_DATA_MOTION and HID_USAGE_SENSOR_DATA_CUSTOM_VALUEX ( X =
> 2,3,4).
> Below are my modifications :
>
> enum accel_3d_channel {
> CHANNEL_SCAN_INDEX_X,
> CHANNEL_SCAN_INDEX_Y,
> CHANNEL_SCAN_INDEX_Z,
> CHANNEL_SCAN_DATA_MOTION,
> CHANNEL_CUSTOM_VALUE_2,
> CHANNEL_CUSTOM_VALUE_3,
>         CHANNEL_CUSTOM_VALUE_4,
> ACCEL_3D_CHANNEL_MAX,
>
> static const u32 accel_3d_addresses[ACCEL_3D_CHANNEL_MAX] = {
> HID_USAGE_SENSOR_ACCEL_X_AXIS,
> HID_USAGE_SENSOR_ACCEL_Y_AXIS,
> HID_USAGE_SENSOR_ACCEL_Z_AXIS,
> HID_USAGE_SENSOR_DATA_MOTION_STATE,
> HID_USAGE_SENSOR_DATA_CUSTOM_VALUE2,
> HID_USAGE_SENSOR_DATA_CUSTOM_VALUE3,
> HID_USAGE_SENSOR_DATA_CUSTOM_VALUE4
> };
>
>
>
> /* Channel definitions */
> static const struct iio_chan_spec accel_3d_channels[] = {
> {
> ..
> ..
> ..
> {
> .type = IIO_ACCEL,
> .modified = 1,
> .channel2 = IIO_MOD_X,
> .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
> BIT(IIO_CHAN_INFO_SCALE) |
> BIT(IIO_CHAN_INFO_SAMP_FREQ) |
> BIT(IIO_CHAN_INFO_HYSTERESIS),
> .scan_index = CHANNEL_SCAN_DATA_MOTION,
> },
> {
> .type = IIO_ACCEL,
> .modified = 1,
> .channel2 = IIO_MOD_X,
> .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
> BIT(IIO_CHAN_INFO_SCALE) |
> BIT(IIO_CHAN_INFO_SAMP_FREQ) |
> BIT(IIO_CHAN_INFO_HYSTERESIS),
> .scan_index = CHANNEL_CUSTOM_VALUE_2,
> },
> {
> .type = IIO_ACCEL,
> .modified = 1,
> .channel2 = IIO_MOD_X,
> .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
> BIT(IIO_CHAN_INFO_SCALE) |
> BIT(IIO_CHAN_INFO_SAMP_FREQ) |
> BIT(IIO_CHAN_INFO_HYSTERESIS),
> .scan_index = CHANNEL_CUSTOM_VALUE_3,
> },
> {
> .type = IIO_ACCEL,
> .modified = 1,
> .channel2 = IIO_MOD_X,
> .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
> .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
> BIT(IIO_CHAN_INFO_SCALE) |
> BIT(IIO_CHAN_INFO_SAMP_FREQ) |
> BIT(IIO_CHAN_INFO_HYSTERESIS),
> .scan_index = CHANNEL_CUSTOM_VALUE_4,
> }
>
>
>
> /* Capture samples in local storage */
> static int accel_3d_capture_sample(struct hid_sensor_hub_device *hsdev,
> unsigned usage_id,
> size_t raw_len, char *raw_data,
> void *priv)
> {
> struct iio_dev *indio_dev = platform_get_drvdata(priv);
> struct accel_3d_state *accel_state = iio_priv(indio_dev);
> int offset;
> int ret = -EINVAL;
>
> switch (usage_id) {
> case HID_USAGE_SENSOR_ACCEL_X_AXIS:
> case HID_USAGE_SENSOR_ACCEL_Y_AXIS:
> case HID_USAGE_SENSOR_ACCEL_Z_AXIS:
> case HID_USAGE_SENSOR_DATA_MOTION_STATE:
>         case HID_USAGE_SENSOR_DATA_CUSTOM_VALUE2:
>   case HID_USAGE_SENSOR_DATA_CUSTOM_VALUE3:
>   case HID_USAGE_SENSOR_DATA_CUSTOM_VALUE4:
> offset = usage_id - HID_USAGE_SENSOR_ACCEL_X_AXIS;
>
>
>
> /* Parse report which is specific to an usage id*/
> static int accel_3d_parse_report(struct platform_device *pdev,
> struct hid_sensor_hub_device *hsdev,
> struct iio_chan_spec *channels,
> unsigned usage_id,
> struct accel_3d_state *st)
> {
> int ret;
> int i;
>
> for (i = 0; i <= CHANNEL_CUSTOM_VALUE_4; ++i) {  //previously <
> CHANNEL_SCAN_INDEX_Z
> ret = sensor_hub_input_get_attribute_info(hsdev,
>
>
>
> After build /insmod i get the following dmesg :
>
> hid_sensor_accel_3d:HID-SENSOR-200073.3 auto : failed to setup attributes
> hid_sensor_accel_3d:HID-SENSOR-200073.3 auto.failed with error -1
>
>
> I am not getting what else I have to modify to avoid this error .If i remove
> the portion in bold(and use this original code
> :http://lxr.free-electrons.com/source/drivers/iio/accel/hid-sensor-accel-3d.c)
> I can happily insert the module without any error and can interact with the
> driver using my application.
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies@xxxxxxxxxxxxxxxxx
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux