Qcom GKI修改添加模块

Qcom GKI

https://source.android.google.cn

1. 什么是GKI

通用内核映像 (GKI), 产品内核(也称为设备内核或 OEM 内核)是指您的设备上搭载的内核。在 GKI 之前,产品内核衍生自一系列上游内核变更。下图显示了内核补充功能如何生成产品内核(OEM/设备内核):
请添加图片描述

①就是内核发布的版本

②在谷歌发布中会取入对应的版本,并基于谷歌添加自己的修改后发布

③就是可以理解为一些厂商,比如qcom,qcom基于谷歌的安卓按照自己的平台添加自己的东西进行定制化

④就是制造商,比如一些车厂或手机购买了qcom平台的支持,再加入自己的定制内容

  1. 来自 kernel.org 的 Linux 长期支持 (LTS) 内核已使用 Android 专用补丁进行修改,进而生成了 Android 通用内核 (ACK)。
  2. 供应商修改了 ACK,以添加对系统芯片 (SoC) 的支持。供应商还可以添加性能或电源优化。生成的内核称为供应商内核。
  3. 最后,原始设备制造商 (OEM) 进一步修改了供应商内核,添加了必要的设备驱动程序和自定义项。生成的内核称为产品内核。

所有这些修改都会导致内核代码中有多达 50% 是树外代码,而非来自上游 Linux 内核或 ACK。在 GKI 之前,几乎所有设备都具有自定义内核,而这导致了内核碎片化问题。

通用内核映像 (GKI) 项目通过统一核心内核并将 SoC 和板级支持从核心内核移至可加载的供应商模块中,解决了内核碎片化问题。GKI 还为供应商模块提供稳定的内核模块接口 (KMI),因此模块和内核可以独立进行更新。GKI 内核的一些特性包括:

  • GKI 内核基于 ACK 源代码构建而成。
  • GKI 内核是每个架构和每个 LTS 版本的单内核二进制文件以及关联的可加载模块(目前只有适用于 android11-5.4android12-5.4 的 arm64)。
  • GKI 内核已经过关联 ACK 支持的所有 Android 平台版本的测试。在 GKI 内核版本的生命周期内不会发生功能废弃。
  • GKI 内核为给定 LTS 中的驱动程序提供了稳定版 KMI。
  • GKI 内核不包含 SoC 专用代码或板级代码。
对于在qcom see上添加ak0997x传感器HAL层代码,可以参考以下步骤: 1. 在`/vendor/qcom/opensource/sensors`目录下创建`ak0997x`目录,用于存放传感器的驱动代码和HAL层代码。 2. 在`/vendor/qcom/opensource/sensors/ak0997x`目录下创建`Android.mk`文件,用于编译传感器驱动代码和HAL层代码。示例代码如下: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := qcom_ak0997x LOCAL_MODULE_TAGS := optional LOCAL_C_INCLUDES := $(LOCAL_PATH)/include LOCAL_SRC_FILES := \ ak0997x.c \ qcom_ak0997x.c LOCAL_MODULE_STL := libc++ include $(BUILD_SHARED_LIBRARY) ``` 其中,`ak0997x.c`为传感器驱动代码,`qcom_ak0997x.c`为HAL层代码。需要根据具体的传感器和硬件平台进行调整。 3. 实现传感器驱动代码`/vendor/qcom/opensource/sensors/ak0997x/ak0997x.c`。该代码负责与硬件交互,读取传感器数据并提供给HAL层使用。示例代码如下: ```c #include <linux/i2c-dev.h> #include <sys/ioctl.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <stdint.h> #include <errno.h> #define AK0997X_I2C_ADDR 0x0C #define AK0997X_REG_WIA1 0x00 #define AK0997X_REG_ST1 0x10 #define AK0997X_REG_HXL 0x11 #define AK0997X_REG_HXH 0x12 #define AK0997X_REG_HYL 0x13 #define AK0997X_REG_HYH 0x14 #define AK0997X_REG_HZL 0x15 #define AK0997X_REG_HZH 0x16 static int ak0997x_i2c_read(int fd, uint8_t reg, uint8_t *buf, uint32_t len) { int ret; uint8_t cmd[1] = {reg}; struct i2c_rdwr_ioctl_data msgset; struct i2c_msg msgs[2]; msgs[0].addr = AK0997X_I2C_ADDR; msgs[0].flags = 0; msgs[0].len = 1; msgs[0].buf = cmd; msgs[1].addr = AK0997X_I2C_ADDR; msgs[1].flags = I2C_M_RD; msgs[1].len = len; msgs[1].buf = buf; msgset.msgs = msgs; msgset.nmsgs = 2; ret = ioctl(fd, I2C_RDWR, &msgset); if (ret < 0) { return ret; } return len; } int ak0997x_read_data(int32_t *data) { int fd; uint8_t buf[6]; int ret; fd = open("/dev/i2c-4", O_RDWR); if (fd < 0) { return -errno; } ret = ak0997x_i2c_read(fd, AK0997X_REG_HXL, buf, sizeof(buf)); if (ret < 0) { close(fd); return ret; } data[0] = ((int16_t)buf[1] << 8) | buf[0]; data[1] = ((int16_t)buf[3] << 8) | buf[2]; data[2] = ((int16_t)buf[5] << 8) | buf[4]; close(fd); return 0; } ``` 其中,`ak0997x_i2c_read`函数用于通过I2C总线读取传感器数据,`ak0997x_read_data`函数用于读取传感器数据并返回给HAL层使用。 4. 实现传感器HAL层代码`/vendor/qcom/opensource/sensors/ak0997x/qcom_ak0997x.c`。该代码负责与Android系统交互,提供传感器服务。示例代码如下: ```c #include <hardware/sensors.h> #define QCOM_AK0997X_SENSOR_HANDLE 0 static const struct sensor_t sSensorList[] = { { .name = "qcom ak0997x", .vendor = "qcom", .version = 1, .handle = QCOM_AK0997X_SENSOR_HANDLE, .type = SENSOR_TYPE_MAGNETIC_FIELD, .maxRange = 2000.0f, .resolution = 0.6f, .power = 0.1f, .minDelay = 10000, .maxDelay = 20000, }, }; static int qcom_ak0997x_init(struct sensors_poll_device_t *dev) { // 初始化传感器并设置相关参数 return 0; } static int qcom_ak0997x_activate(struct sensors_poll_device_t *dev, int handle, int enabled) { // 激活或关闭传感器 return 0; } static int qcom_ak0997x_setDelay(struct sensors_poll_device_t *dev, int handle, int64_t ns) { // 设置传感器采样周期 return 0; } static int qcom_ak0997x_poll(struct sensors_poll_device_t *dev, sensors_event_t *data, int count) { // 读取传感器数据并返回给上层应用 int32_t mag_data[3] = {0}; ak0997x_read_data(mag_data); data->version = sizeof(sensors_event_t); data->sensor = QCOM_AK0997X_SENSOR_HANDLE; data->type = SENSOR_TYPE_MAGNETIC_FIELD; data->timestamp = getTimestamp(); data->magnetic.x = mag_data[0] * 0.6f; data->magnetic.y = mag_data[1] * 0.6f; data->magnetic.z = mag_data[2] * 0.6f; return 1; } static int qcom_ak0997x_close(struct hw_device_t *dev) { // 关闭传感器 return 0; } static int qcom_ak0997x_get_sensors_list(struct sensors_module_t* module, struct sensor_t const** list) { *list = sSensorList; return 1; } static struct hw_module_methods_t qcom_ak0997x_module_methods = { .open = NULL, }; struct sensors_module_t HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = SENSORS_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = "qcom_ak0997x", .name = "qcom ak0997x module", .author = "qcom", .methods = &qcom_ak0997x_module_methods, }, .get_sensors_list = qcom_ak0997x_get_sensors_list, }; ``` 需要注意的是,上述代码中的函数实现需要根据具体的传感器类型和硬件平台进行调整。另外,还需要在Android源码中注册HAL层模块,才能在系统中使用该传感器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IAYL.BL

创作不易,投个硬币😆

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值