继续上一个链接内容所讲:http://www.cnblogs.com/linhaostudy/p/8430583.html
下面bmp18x sensor为例进行分析。
BMP18x Sensor:
我们以打开bmp180为例,代码为hardwareqcomsensorsBmp180.cpp:
1 PressureSensor::PressureSensor(char *name) 2 : SensorBase(NULL, "bmp18x"), 3 mInputReader(4), 4 mHasPendingEvent(false), 5 mEnabledTime(0) 6 { 7 mPendingEvent.version = sizeof(sensors_event_t); 8 mPendingEvent.sensor = SENSORS_PRESSURE_HANDLE; 9 mPendingEvent.type = SENSOR_TYPE_PRESSURE; 10 memset(mPendingEvent.data, 0, sizeof(mPendingEvent.data)); 11 12 if (data_fd) { 13 strlcpy(input_sysfs_path, SYSFS_CLASS, sizeof(input_sysfs_path)); 14 strlcat(input_sysfs_path, name, sizeof(input_sysfs_path)); 15 strlcat(input_sysfs_path, "/", sizeof(input_sysfs_path)); 16 input_sysfs_path_len = strlen(input_sysfs_path); 17 ALOGI("The pressure sensor path is %s",input_sysfs_path); 18 enable(0, 1); 19 } 20 } 21 22 23 PressureSensor::PressureSensor(char *name) 24 : SensorBase(NULL, "bmp18x"), 25 mInputReader(4), 26 mHasPendingEvent(false), 27 mEnabledTime(0) 28 { 29 mPendingEvent.version = sizeof(sensors_event_t); 30 mPendingEvent.sensor = SENSORS_PRESSURE_HANDLE; 31 mPendingEvent.type = SENSOR_TYPE_PRESSURE; 32 memset(mPendingEvent.data, 0, sizeof(mPendingEvent.data)); 33 34 if (data_fd) { 35 strlcpy(input_sysfs_path, SYSFS_CLASS, sizeof(input_sysfs_path)); 36 strlcat(input_sysfs_path, name, sizeof(input_sysfs_path)); 37 strlcat(input_sysfs_path, "/", sizeof(input_sysfs_path)); 38 input_sysfs_path_len = strlen(input_sysfs_path); 39 ALOGI("The pressure sensor path is %s",input_sysfs_path); 40 enable(0, 1); 41 } 42 }
mPendingEvent是一个sensors_event_t结构体,首先对sensor、type等赋值,然后调用enable打开;
1 /** 2 * @brief This function will enable/disable sensor. 3 * @param[in] handle 4 * which sensor to enable/disable. 5 * @param[in] en 6 * en=1, enable; 7 * en=0, disable 8 * @return if the operation is successful. 9 */ 10 int PressureSensor::enable(int32_t handle, int en) 11 { 12 VFUNC_LOG; 13 14 int res = 0; 15 16 LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)", 17 en, pressureSysFs.pressure_enable, getTimestamp()); 18 res = write_sysfs_int(pressureSysFs.pressure_enable, en); 19 20 return res; 21 }
其实就是对SYSFS_CLASS路径下的文件的enable节点写值“1”;
SYSFS_CLASS的路径为(hardwareqcomsensorssensors.h):
1 #define SYSFS_CLASS "/sys/class/sensors/"
注意,不要忽略了SensorBase(NULL, "bmp18x"),我们看一下它做了什么?
1 /*****************************************************************************/ 2 3 SensorBase::SensorBase( 4 const char* dev_name, 5 const char* data_name, 6 const struct SensorContext* context /* = NULL */) 7 : dev_name(dev_name), data_name(data_name), algo(NULL), 8 dev_fd(-1), data_fd(-1), mEnabled(0), mHasPendingMetadata(0) 9 { 10 if (context != NULL) { 11 CalibrationManager& cm(CalibrationManager::getInstance()); 12 algo = cm.getCalAlgo(context->sensor); 13 14 /* Set up the sensors_meta_data_event_t event*/ 15 meta_data.version = META_DATA_VERSION; 16 meta_data.sensor = context->sensor->handle; 17 meta_data.type = SENSOR_TYPE_META_DATA; 18 meta_data.reserved0 = 0; 19 meta_data.timestamp = 0LL; 20 meta_data.meta_data.what = META_DATA_FLUSH_COMPLETE; 21 meta_data.meta_data.sensor = context->sensor->handle; 22 } 23 24 if (data_name) { 25 data_fd = openInput(data_name); 26 } 27 }
这里的dev_name为NULL,data_name为bmp18x,设置dev_name和data_name后调用openInput打开设备:
1 int SensorBase::openInput(const char* inputName) { 2 int fd = -1; 3 const char *dirname = "/dev/input"; 4 char devname[PATH_MAX]; 5 char *filename; 6 DIR *dir; 7 struct dirent *de; 8 dir = opendir(dirname); 9 if(dir == NULL) 10 return -1; 11 strlcpy(devname, dirname, PATH_MAX); 12 filename = devname + strlen(dirname); 13 *filename++ = '/'; 14 while((de = readdir(dir))) { 15 if(de->d_name[0] == '.' && 16 (de->d_name[1] == '