/*
* Copyright (C) 2012 Sony Mobile Communications AB.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "DASH - lsm303dlh"
#include <stdlib.h>
#include <string.h>
#include "sensors_log.h"
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <pthread.h>
#include <errno.h>
#include "sensors_list.h"
#include "sensors_fifo.h"
#include "sensors_select.h"
#include "sensor_util.h"
#include "sensors_id.h"
#include "sensors_config.h"
#include "lsm303dlh.h"
#include "sensors_compass_API.h"
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define DELAY_LOWEST_MS 1000
#define DEBUG_VERBOSE 0
#define PHYS_PATH_BASE "/sys/bus/i2c/devices"
#define PHYS_PATH_LEN (sizeof(PHYS_PATH_BASE) + sizeof("/0-0000/"))
#define ATTR_NAME_LEN 32
#define DEV_PATH_LEN sizeof("/dev/input/event/4294967295")
enum android_rates {
RATE_GAME = 20,
RATE_UI = 60,
RATE_NORMAL = 200,
};
enum dev_mode {
MODE_FASTEST,
MODE_GAME,
MODE_UI,
MODE_NORMAL,
MODES_NUM
};
enum user_type {
USER_INTERNAL = 0x01,
USER_EXTERNAL = 0x02,
};
enum {
AXIS_X,
AXIS_Y,
AXIS_Z,
NUM_AXIS
};
struct config_record {
int max;
int min;
int size;
int *store;
};
struct sensor_desc {
struct sensor_t sensor;
struct sensor_api_t api;
struct sensors_select_t select_worker;
int status;
int data[3];
char *map_prefix;
int map[3];
int sign[3];
enum user_type users;
int64_t internal_delay;
int64_t external_delay;
int applied_delay_ms;
float scale;
void * (*read)(void *);
int (*find_input)(struct sensor_desc *d);
char *input_name;
char dev_path[DEV_PATH_LEN];
char phys_path[PHYS_PATH_LEN + ATTR_NAME_LEN];
char *dev_name;
char *dev_attr_rate_ms;
char *dev_attr_range_mg;
char *dev_attr_mode;
char *dev_modes[MODES_NUM];
};
static struct sensor_desc *required_sensors[2];
static struct sensor_desc *sensor_acc;
static struct sensor_desc *sensor_mag;
static struct sensor_desc *sensor_compass;
static int compass_api_activated;
static int num_formations;
static pthread_mutex_t lock;
static int config_read_axis(char *prefix, char *key, struct config_record *cr)
{
int rc = -1;
int tmp[NUM_AXIS];
if (!sensors_config_get_key(prefix, key, TYPE_ARRAY_INT, tmp, cr->size)) {
int i;
for (i = 0; i < cr->size; i++) {
if (tmp[i] < cr->min || tmp[i] > cr->max)
break;
}
if (i == cr->size) {
memcpy(cr->store, tmp, sizeof(tmp));
rc = 0;
} else {
ALOGE("%s: bad config (%s_%s) [%2d %2d %2d]", __func__,
prefix, key, tmp[AXIS_X], tmp[AXIS_Y],
tmp[AXIS_Z]);
}
} else {
ALOGE("%s: failed to read %s_%s", __func__, prefix, key);
}
return rc;
}
static void config_read_sensor_map(struct sensor_desc *d)
{
struct config_record rec;
if (!sensors_have_config_file()) {
ALOGI("%s: No config file found. Using default config.",
__func__);
return;
}
rec.size = NUM_AXIS;
rec.min = AXIS_X;
rec.max = AXIS_Z;
rec.store = d->map;
config_read_axis(d->map_prefix, "axis_map", &rec);
rec.min = -1;
rec.max = 1;
rec.store = d->sign;
config_read_axis(d->map_prefix, "axis_sign", &rec);
ALOGD("%s: %s: axis map [%2d %2d %2d]", __func__, d->sensor.name,
d->map[AXIS_X], d->map[AXIS_Y], d->map[AXIS_Z]);
ALOGD("%s: %s: axis sign [%2d %2d %2d]", __func__, d->sensor.name,
d->sign[AXIS_X], d->sign[AXIS_Y], d->sign[AXIS_Z]);
}
static int store_str_attr(struct sensor_desc *d, const char *attr,
const char *val)
{
int rc;
int fd;
unsigned l = strlen(d->phys_path);
if (!*d->phys_path)
return 0;
rc = snprintf(d->phys_path + l, sizeof(d->phys_path) - l, "%s", attr);
if ((unsigned)rc >= sizeof(d->phys_path) - l) {
ALOGE("%s: Attr path truncated to '%s'\n", __func__,
d->phys_path);
rc = -1;
goto exit;
}
fd = open(d->phys_path, O_WRONLY);
ALOGD("%s: '%s' = %s", __func__, d->phys_path, val);
if (fd < 0) {
ALOGE("%s: unable to open %s, err %d\n", __func__,
d->phys_path, errno);
rc = -1;
goto exit;
}
rc = write(fd, val, strlen(val));
if (rc < 0)
ALOGE("%s: unable to write %s (fd %d), err %d\n", __func__,
d->phys_path, fd, errno);
close(fd);
exit:
d->phys_path[l] = 0;
return rc > 0 ? 0 : rc;
}
static int store_int_attr(struct sensor_desc *d, const char *attr, int value)
{
char b[16];
(void)snprintf(b, sizeof(b), "%d\n", value);
return store_str_attr(d, attr, b);
}
static void scale_data(struct sensors_event_t *s, struct sensor_desc *d)
{
unsigned i;
float scale = d->scale;
for (i = 0; i < ARRAY_SIZE(s->data); i++)
s->data[i] = d->data[i] * scale;
}
static int compass_status(int accuracy)
{
if (accuracy <= 110)
return SENSOR_STATUS_ACCURACY_HIGH;
else if (accuracy < 130)
return SENSOR_STATUS_ACCURACY_MEDIUM;
else if (accuracy < 150)
return SENSOR_STATUS_ACCURACY_LOW;
else
return SENSOR_STATUS_UNRELIABLE;
}
static int compass_run(sensors_event_t *s)
{
int rc;
int accuracy = -1;
rc = compass_API_SaveAcc(sensor_acc->data[0],
sensor_acc->data[1],
sensor_acc->data[2]);
if (rc) {
ALOGE("%s: compass_API_SaveAcc, error %d\n", __func__, rc);
goto exit;
}
rc = compass_API_SaveMag(sensor_mag->data[0],
sensor_mag->data[1],
sensor_mag->data[2]);
if (rc) {
ALOGE("%s: compass_API_SaveMag, error %d\n", __func__, rc);
goto exit;
}
rc = compass_API_Run();
if (!rc) {
rc = compass_API_OrientationValues(s);
if (!rc)
accuracy = compass_API_GetCalibrationGodness();
else
ALOGE("%s GetCalibrationGodness, error %d\n",
__func__, rc);
} else {
ALOGE("%s: compass_API_Run, error %d\n", __func__, rc);
}
rc = compass_API_GetNewFullScale();
if (rc) {
int range = to_lsm303dlh_mag_range(rc);
ALOGD("%s: new range %d requested", __func__, rc);
if (sensor_mag->dev_attr_range_mg)
store_int_attr(sensor_mag,
sensor_mag->dev_attr_range_mg, range);
else
ALOGI("%s: magnetic range not supported", __func__);
}
exit:
ALOGD("%s: accuracy %d\n", __func__, accuracy);
return accuracy;
}
static void compass_formation(int value)
{
ALOGD("%s: formation %d", __func__, value);
compass_API_ChangeFormFactor(!!value);
}
static int find_input_dev(struct sensor_desc *d)
{
return input_dev_path_by_name(d->input_name, d->dev_path,
sizeof(d->dev_path));
}
static int compass_find_input_dev(struct sensor_desc *d)
{
return input_dev_path_by_keycode(EV_SW, SW_LID, d->dev_path,
sizeof(d->dev_path));
}
static int open_input_device(struct sensor_desc *d)
{
int rc;
if (!*d->dev_path) {
ALOGD("%s: No input device for %s", __func__, d->sensor.name);
return -1;
}
rc = open(d->dev_path, O_RDONLY | O_NONBLOCK);
if (rc < 0) {
ALOGE("%s: Failed to open '%s' but access (R_OK) got",
__func__, d->dev_path);
}
return rc;
}
static int sensor_init(struct sensor_api_t *s_api)
{
struct sensor_desc *d = container_of(s_api, struct sensor_desc, api);
int rc;
rc = dev_phys_path_by_attr("name", d->dev_name, PHYS_PATH_BASE,
d->phys_path, sizeof(d->phys_path));
if (rc) {
ALOGE("%s: no phys dev path for dev name '%s'", __func__,
d->dev_name);
*d->phys_path = 0;
}
config_read_sensor_map(d);
sensors_select_init(&d->select_worker, d->read, d, -1);
return 0;
}
static int set_current_formation(int fd, int formation)
{
if (fd >= 0) {
/*
* TODO: perform formation check (ioctl)
*/
formation = 0;
}
compass_API_ChangeFormFactor(formation);
return formation;
}
static int compass_api_init(struct sensor_desc *d, int fd)
{
int rc;
int f;
rc = compass
没有合适的资源?快使用搜索试试~ 我知道了~
动态 Android传感器HAL_C语言_代码_相关文件_下载

共98个文件
c:50个
h:25个
mk:13个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 29 浏览量
2022-07-13
17:14:34
上传
评论
收藏 135KB ZIP 举报
温馨提示
这种传感器 HAL 实现可以使用一个通用部件 满足多种产品需求的代码。通过增加可能性 要在编译时启用传感器,只需指定哪个 产品使用的传感器。 该实现还增加了对在运行时配置传感器的支持 使用配置文件。这使得例如设置 PCB 安装成为可能 传感器的坐标。 DASH 是唯一需要的传感器 HAL 实现,因此 维护工作保持在最低限度。 2 文件概述 --------------- 2.1 控制 文件:sensors_module.c 此文件实现传感器 HAL 接口。它遍历启用的传感器 并将传入请求路由到正确的传感器。 2.2 传感器列表 文件:sensors_list.c 每个传感器在使用 gcc 链接库时注册到此列表 构造函数。这使得可以在编译时决定哪些传感器 应该支持。 该模块提供了一个用于获取和迭代传感器的接口。 2.3 传感器接口 文件:sensor_api.h 这定义了传感器的抽象。传感器支持:初始化、激活、 设置延迟并关闭。 2.4 传感器实现 文件:传感器/*.c 更多详情、使用方法,请下载后细读README.md文件
资源详情
资源评论
资源推荐
收起资源包目录





















































































































共 98 条
- 1
























快撑死的鱼
- 粉丝: 2w+
- 资源: 9155

下载权益

C知道特权

VIP文章

课程特权

开通VIP
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 智能防火楼道(华为云)
- DB-GPT是一个开源的AI原生数据应用开发框架
- ultralytics_BiFPN.zip
- 国产SM4加密解密,html页面CBC模式加密解密,ECB模式加密解密,java后台CBC,ECB模式加密解密
- Zenith TVSS.docx
- node.js18.20.6-x64
- 机器学习-零售商品购物篮分析及预测(含数据集及说明)
- 基于高斯混合模型聚类的风电场短期功率预测方案:优化分组与RBF神经网络验证,基于高斯混合模型聚类的风电场短期功率预测方案:优化分组与RBF神经网络验证,基于高斯混合模型聚类的风电场短期功率预测方法 说
- 基于Vue2.6和.NetCore3.1的跨平台工业互联网CPS系统:助力工业数字化转型的多租户多语言应用平台,Vue工业互联网平台:多租户跨平台支持,涵盖工业4.0主流业务需求,助力企业数字化转型
- 软件测试面试题10道.zip
- 光耦继电器Multisim软件电路仿真
- 西门子S200伺服驱动器进行固件升级的具体方法.docx
- 级联H桥储能系统研究与设计:均衡控制策略探讨及蓄电池充放电控制方法探讨参考论文研究设计级联H桥储能系统在dq坐标系下的PI解耦控制策略,级联H桥储能系统研究与设计:SOC均衡控制策略及蓄电池充放电控制
- 软件测试面试题10道第二弹.zip
- html页面国密SM4加密解密
- 软件测试面试题10道第三弹.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0