【QCOM Automotive 学习笔记】Android 如何添加busybox telnetd 服务

【SA8295】Android 如何添加busybox telnetd 服务


 


一、下载 busybox-1.36.1.tar.bz2 源码包

busybox 官网链接:BusyBox
busybox-1.36.1.tar.bz2 下载链接:https://busybox.net/downloads/busybox-1.36.1.tar.bz2

在这里插入图片描述

 

二、编译 busybox 源码

这个不会随着 Android 自动编译,需手动编译好,将编译后的文件上库

编译方法,参考 busybox-1.36.1\INSTALL 文件

  1. make defconfig, 生成 .config
    defconfig (默认配置)、allyesconfig(最大配置)、allnoconfig(最小配置),

  2. make menuconfig,根据 .config 内容,图形化界面进行修改添加或去除某些命令

  3. make CROSS_COMPILE=aarch64-linux-gnu-
    可以指定其他的编译器, 如 aarch64-linux-gnu- 或 aarch64-linux-android-

三、将编译后的 busybox 打包编入Android 镜像中

在这里插入图片描述

  1. 编写 Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := busybox
LOCAL_SRC_FILES :=  busybox
LOCAL_MODULE_TAGS := optional 
LOCAL_MODULE_CLASS := EXECUTABLES
ifeq ($(TARGET_BUILD_VARIANT),$(filter $(TARGET_BUILD_VARIANT),userdebug eng))
LOCAL_INIT_RC := busybox-telnetd.rc
else
LOCAL_INIT_RC := user/busybox-telnetd.rc
endif
include $(BUILD_PREBUILT)
  1. 编写 Android.dp
cc_prebuilt_binary {
    name: "busybox",
    vendor_available: true,
    init_rc: ["busybox-telnetd.rc"],
    srcs:  ["busybox"],
}
  1. 修改 msmnile_gvmq.mk ,将 busybox参与编译
# android/device/qcom/msmnile_gvmq/msmnile_gvmq.mk

PRODUCT_PACKAGES += busybox
  1. 编写 busybox-telnetd.rc ,让 telnetd 服务自启动
# busybox-telnetd.rc
service busybox-telnetd /system/bin/busybox telnetd -b 192.168.118.1:1024 -F -l /system/bin/sh
    class core
    user shell
    group shell input log adb readproc sdcard_rw sdcard_r net_bt_admin net_bt inet net_bw_stats uhid
    seclabel u:r:shell:s0
    setenv HOSTNAME console
    writepid /dev/cpuset/system-background/tasks
  1. 下载后,开机后查看 telnetd 服务是否启动:ps -ef | grep busybox
    在这里插入图片描述


 


  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于在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层模块,才能在系统中使用该传感器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值