int CompassSensor::inv_init_sysfs_attributes(void) { VFUNC_LOG; unsigned char i = 0; char sysfs_path[MAX_SYSFS_NAME_LEN]; char iio_trigger_path[MAX_SYSFS_NAME_LEN], tbuf[2]; char *sptr; char **dptr; int num; pathP = (char*)malloc( sizeof(char[COMPASS_MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN])); sptr = pathP; dptr = (char**)&compassSysFs; if (sptr == NULL) return -1; memset(sysfs_path, 0, sizeof(sysfs_path)); memset(iio_trigger_path, 0, sizeof(iio_trigger_path)); do { *dptr++ = sptr; memset(sptr, 0, sizeof(sptr)); sptr += sizeof(char[MAX_SYSFS_NAME_LEN]); } while (++i < COMPASS_MAX_SYSFS_ATTRB); // get proper (in absolute/relative) IIO path & build MPU's sysfs paths // inv_get_sysfs_abs_path(sysfs_path); inv_get_sysfs_path(sysfs_path); inv_get_iio_trigger_path(iio_trigger_path); #if defined COMPASS_AK8975 inv_get_input_number(dev_name, &num); tbuf[0] = num + 0x30; tbuf[1] = 0; sprintf(sysfs_path, "%s%s", "sys/class/input/input", tbuf); strcat(sysfs_path, "/ak8975"); sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/enable"); sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/rate"); sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/scale"); sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix"); #else sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/compass_enable"); sprintf(compassSysFs.compass_fifo_enable, "%s%s", sysfs_path, "/compass_fifo_enable"); sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/compass_rate"); sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/in_magn_scale"); sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix"); #endif #if 0 // test print sysfs paths dptr = (char**)&compassSysFs; for (i = 0; i < COMPASS_MAX_SYSFS_ATTRB; i++) { LOGE("HAL:sysfs path: %s", *dptr++); } #endif return 0; }
int inv_init_sysfs_attributes(void) { unsigned char i = 0; char sysfs_path[MAX_SYSFS_NAME_LEN]; char *sptr; char **dptr; sysfs_names_ptr = (char*)malloc(sizeof(char[MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN])); sptr = sysfs_names_ptr; if (sptr != NULL) { dptr = (char**)&mpu; do { *dptr++ = sptr; sptr += sizeof(char[MAX_SYSFS_NAME_LEN]); } while (++i < MAX_SYSFS_ATTRB); } else { MPL_LOGE("couldn't alloc mem for sysfs paths"); return -1; } // get proper (in absolute/relative) IIO path & build MPU's sysfs paths inv_get_sysfs_path(sysfs_path); sprintf(mpu.enable, "%s%s", sysfs_path, "/buffer/enable"); sprintf(mpu.power_state, "%s%s", sysfs_path, "/power_state"); sprintf(mpu.dmp_on,"%s%s", sysfs_path, "/dmp_on"); sprintf(mpu.dmp_int_on, "%s%s", sysfs_path, "/dmp_int_on"); sprintf(mpu.self_test, "%s%s", sysfs_path, "/self_test"); sprintf(mpu.dmp_firmware, "%s%s", sysfs_path, "/dmp_firmware"); sprintf(mpu.firmware_loaded, "%s%s", sysfs_path, "/firmware_loaded"); sprintf(mpu.display_orientation_on, "%s%s", sysfs_path, "/display_orientation_on"); sprintf(mpu.orientation_on, "%s%s", sysfs_path, "/orientation_on"); sprintf(mpu.event_flick, "%s%s", sysfs_path, "/event_flick"); sprintf(mpu.event_display_orientation, "%s%s", sysfs_path, "/event_display_orientation"); sprintf(mpu.event_orientation, "%s%s", sysfs_path, "/event_orientation"); sprintf(mpu.event_tap, "%s%s", sysfs_path, "/event_tap"); sprintf(mpu.flick_axis, "%s%s", sysfs_path, "/flick_axis"); sprintf(mpu.flick_counter, "%s%s", sysfs_path, "/flick_counter"); sprintf(mpu.flick_int_on, "%s%s", sysfs_path, "/flick_int_on"); sprintf(mpu.flick_lower, "%s%s", sysfs_path, "/flick_lower"); sprintf(mpu.flick_upper, "%s%s", sysfs_path, "/flick_upper"); sprintf(mpu.flick_message_on, "%s%s", sysfs_path, "/flick_message_on"); sprintf(mpu.tap_min_count, "%s%s", sysfs_path, "/tap_min_count"); sprintf(mpu.tap_on, "%s%s", sysfs_path, "/tap_on"); sprintf(mpu.tap_threshold, "%s%s", sysfs_path, "/tap_threshold"); sprintf(mpu.tap_time, "%s%s", sysfs_path, "/tap_time"); #if 0 // test print sysfs paths dptr = (char**)&mpu; for (i = 0; i < MAX_SYSFS_ATTRB; i++) { MPL_LOGE("sysfs path: %s", *dptr++); } #endif return 0; }
int main(int argc, char **argv) { unsigned long buf_len = 240; int ret, c, i; char *trigger_name = NULL; int datardytrigger = 1; int trig_num; char *dummy; char chip_name[10]; char device_name[10]; char sysfs[100]; gyro_data_is_enabled = 0; accel_data_is_enabled = 0; compass_data_is_enabled = 0; quaternion_data_is_enabled = 0; while ((c = getopt(argc, argv, "lcd:e:rmp")) != -1) { switch (c) { case 'c': has_compass = 1; break; case 'p': has_pressure = 1; break; case 'd': disable_delay = strtoul(optarg, &dummy, 10); break; case 'e': enable_delay = strtoul(optarg, &dummy, 10); break; case 'r': enable_random_delay = 1; break; case 'm': enable_motion_on = 1; break; case '?': return -1; } } inv_get_sysfs_path(sysfs); printf("sss:::%s\n", sysfs); if (inv_get_chip_name(chip_name) != INV_SUCCESS) { printf("get chip name fail\n"); exit(0); } printf("chip_name=%s\n", chip_name); if (INV_SUCCESS != inv_check_key()) printf("key check fail\n"); else printf("key authenticated\n"); for (i=0; i<strlen(chip_name); i++) { device_name[i] = tolower(chip_name[i]); } device_name[strlen(chip_name)] = '\0'; printf("device name: %s\n", device_name); /* Find the device requested */ dev_num = find_type_by_name(device_name, "iio:device"); if (dev_num < 0) { printf("Failed to find the %s\n", device_name); ret = -ENODEV; goto error_ret; } printf("iio device number being used is %d\n", dev_num); asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num); printf("allco=%x\n", (int)dev_dir_name); if (trigger_name == NULL) { /* * Build the trigger name. If it is device associated it's * name is <device_name>_dev[n] where n matches the device * number found above */ ret = asprintf(&trigger_name, "%s-dev%d", device_name, dev_num); if (ret < 0) { ret = -ENOMEM; goto error_ret; } } /* Verify the trigger exists */ trig_num = find_type_by_name(trigger_name, "trigger"); if (trig_num < 0) { printf("Failed to find the trigger %s\n", trigger_name); ret = -ENODEV; goto error_free_triggername; } printf("iio trigger number being used is %d\n", trig_num); ret = asprintf(&buf_dir_name, "%siio:device%d/buffer", iio_dir, dev_num); if (ret < 0) { ret = -ENOMEM; goto error_free_triggername; } enable_enable_main(0); ret = write_sysfs_int_and_verify("power_state", dev_dir_name, 1); /* * Parse the files in scan_elements to identify what channels are * present */ ret = 0; setup_dmp(dev_dir_name); printf("%s %s\n", dev_dir_name, trigger_name); /* Set the device trigger to be the data rdy trigger found above */ ret = write_sysfs_string_and_verify("trigger/current_trigger", dev_dir_name, trigger_name); if (ret < 0) { printf("Failed to write current_trigger file\n"); goto error_free_buf_dir_name; } /* Setup ring buffer parameters */ /* length must be even number because iio_store_to_sw_ring is expecting half pointer to be equal to the read pointer, which is impossible when buflen is odd number. This is actually a bug in the code */ ret = write_sysfs_int("length", buf_dir_name, buf_len*2); if (ret < 0) goto exit_here; enable_enable_main(1); inv_create_thread(); exit_here: error_free_buf_dir_name: free(buf_dir_name); error_free_triggername: if (datardytrigger) free(trigger_name); error_ret: return ret; }