自定义scp与ap数据传输命令

-----欢迎点赞,收藏和关注------

自定义SCP与AP数据传输命令

本文目的与说明

本文章旨在举例说明如何自定义一个数据传输命令,在scp与ap之间。比如,已经实现的命令有enable之类的命令,它们携带的数据大小都有限,一般也就12byte(3个int数据)。

下文举例说明传输一个64byte的数据结构。

sensor框架这方面,1.0和2.0都可以参考本文。

本文在2.0框架下实现,通过命令获取距感信息。

框架图

在这里插入图片描述

AP侧实现

需要从scp获取数据的结构体

struct xjh_sensor_hardware_info_t {
	char chip[16];
	char vendor[16];
	char id[16];
	char more[16];
};

ap侧获取scp数据的接口如下,自定的命令CUST_ACTION_GET_XJH_HARDWARE_INFO是仿照CUST_ACTION_GET_SENSOR_INFO添加的。其中xjhSensorInfo结构体需要自行添加,仿照getInfo结构体添加。xjhHwInfo结构也是需要添加的,仿照sensorInfo结构体添加。代码有删减,只保留说明部分。

//drivers\misc\mediatek\sensor\2.0\mtk_nanohub\mtk_nanohub.c
int mtk_nanohub_set_cmd_to_hub(uint8_t sensor_id,
		enum CUST_ACTION action, void *data)
{
    union SCP_SENSOR_HUB_DATA req;
	int len = 0, err = 0;
	struct SCP_SENSOR_HUB_GET_RAW_DATA *pGetRawData;

	req.get_data_req.sensorType = sensor_id;
	req.get_data_req.action = SENSOR_HUB_SET_CUST;
    switch (sensor_id) {
        case ID_PROXIMITY:
		req.set_cust_req.sensorType = ID_PROXIMITY;
		req.set_cust_req.action = SENSOR_HUB_SET_CUST;
		switch (action) {
            case CUST_ACTION_GET_SENSOR_INFO:
                req.set_cust_req.getInfo.action =
                    CUST_ACTION_GET_SENSOR_INFO;
                len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
                    custData) + sizeof(req.set_cust_req.getInfo);
                break;
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
            case CUST_ACTION_GET_XJH_HARDWARE_INFO:
                req.set_cust_req.xjhSensorInfo.action =
                    CUST_ACTION_GET_XJH_HARDWARE_INFO;
                len = offsetof(struct SCP_SENSOR_HUB_SET_CUST_REQ,
                    custData) + sizeof(req.set_cust_req.xjhSensorInfo);
                break;
#endif
		default:
			return -1;
		}
    }

    err = mtk_nanohub_req_send(&req);
	if (err < 0) {
		pr_err("set_cust fail!\n");
		return -1;
	}

    switch (action) {
	case CUST_ACTION_GET_SENSOR_INFO:
		if (req.set_cust_rsp.getInfo.action !=
			CUST_ACTION_GET_SENSOR_INFO) {
			pr_info("get_info failed!\n");
			return -1;
		}
		memcpy((struct sensorInfo_t *)data,
			&req.set_cust_rsp.getInfo.sensorInfo,
			sizeof(struct sensorInfo_t));
		break;
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
	case CUST_ACTION_GET_XJH_HARDWARE_INFO:
		if (req.set_cust_rsp.xjhSensorInfo.action !=
			CUST_ACTION_GET_XJH_HARDWARE_INFO) {
			pr_info("scp_sensorHub_req_send failed action!\n");
			return -1;
		}
		memcpy((struct xjh_sensor_hardware_info_t *)data,
			&req.set_cust_rsp.xjhSensorInfo.xjhHwInfo,
			sizeof(struct xjh_sensor_hardware_info_t));
break;
#endif	
	default:
		break;
	}
	return err;
}

自定义结构体添加

//drivers\misc\mediatek\sensor\2.0\mtk_nanohub\mtk_nanohub.h
enum CUST_ACTION {
	CUST_ACTION_SET_CUST = 1,
	CUST_ACTION_SET_CALI,
	CUST_ACTION_RESET_CALI,
	CUST_ACTION_SET_TRACE,
	CUST_ACTION_SET_DIRECTION,
	CUST_ACTION_SHOW_REG,
	CUST_ACTION_GET_RAW_DATA,
	CUST_ACTION_SET_PS_THRESHOLD,
	CUST_ACTION_SHOW_ALSLV,
	CUST_ACTION_SHOW_ALSVAL,
	CUST_ACTION_SET_FACTORY,
	CUST_ACTION_GET_SENSOR_INFO,
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
	CUST_ACTION_GET_XJH_HARDWARE_INFO,
#endif
};

#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
struct xjh_sensor_hardware_info_t {
	char chip[16];
	char vendor[16];
	char id[16];
	char more[16];
};

struct scp_sensor_hub_xjh_hardware_info_t {
	enum CUST_ACTION action;
	union {
		int32_t int32_data[0];
		struct xjh_sensor_hardware_info_t cpHwInfo;
	};
};
#endif 

struct SCP_SENSOR_HUB_SET_CUST_REQ {
	uint8_t sensorType;
	uint8_t action;
	uint8_t reserve[2];
	union {
		uint32_t custData[11];
		struct SCP_SENSOR_HUB_CUST cust;
		struct SCP_SENSOR_HUB_SET_CUST setCust;
		struct SCP_SENSOR_HUB_SET_CALI setCali;
		struct SCP_SENSOR_HUB_RESET_CALI resetCali;
		struct SCP_SENSOR_HUB_SET_TRACE setTrace;
		struct SCP_SENSOR_HUB_SET_DIRECTION setDirection;
		struct SCP_SENSOR_HUB_SHOW_REG showReg;
		struct SCP_SENSOR_HUB_GET_RAW_DATA getRawData;
		struct SCP_SENSOR_HUB_SETPS_THRESHOLD setPSThreshold;
		struct SCP_SENSOR_HUB_SHOW_ALSLV showAlslv;
		struct SCP_SENSOR_HUB_SHOW_ALSVAL showAlsval;
		struct SCP_SENSOR_HUB_SET_FACTORY setFactory;
		struct scp_sensor_hub_get_sensor_info getInfo;
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
		struct scp_sensor_hub_xjh_hardware_info_t xjhSensorInfo;
#endif
	};
};

struct SCP_SENSOR_HUB_SET_CUST_RSP {
	uint8_t sensorType;
	uint8_t action;
	uint8_t errCode;
	uint8_t reserve[1];
	union {
		uint32_t custData[11];
		struct SCP_SENSOR_HUB_GET_RAW_DATA getRawData;
		struct scp_sensor_hub_get_sensor_info getInfo;
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
		struct scp_sensor_hub_xjh_hardware_info_t xjhSensorInfo;
#endif
	};
};

扩充了原有的结构体,有可能会超过数据传输的最大限度。代码要求如下:

  • SENSOR_IPI_SIZE = SCP_SENSOR_HUB_DATA
  • SENSOR_IPI_SIZE = SENSOR_DATA_SIZE - 4
  • SENSOR_DATA_SIZE = struct data_unit_t

注:SENSOR_IPI_SIZE和SENSOR_DATA_SIZE 为宏,SCP_SENSOR_HUB_DATA为共用体。此处的比较为【宏的值】与【结构体的大小】。

SCP_SENSOR_HUB_DATA共用体包含struct SCP_SENSOR_HUB_SET_CUST_RSP结构体,而后者增加了数据,有可能会增加前者的数据大小。这里就不去计算前者中哪个结构最大,直接给出结果:后者在前者中数据最大,后者增加了24byte(68 - 4*11,11来源于SCP_SENSOR_HUB_SET_CUST_REQ结构体成员custData)。

那么就需要增加如下修改:

//drivers\misc\mediatek\sensor\2.0\mtk_nanohub\mtk_nanohub.c
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
#define SENSOR_IPI_SIZE 72
#else
#define SENSOR_IPI_SIZE 48
#endif

#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
#define SENSOR_DATA_SIZE 68
#else
#define SENSOR_DATA_SIZE 44
#endif

//drivers\misc\mediatek\sensor\2.0\mtk_nanohub\mtk_nanohub.h
struct SCP_SENSOR_HUB_REQ {
	uint8_t sensorType;
	uint8_t action;
	uint8_t reserve[2];
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
	uint32_t data[17];
#else
 	uint32_t data[11];
#endif
};

struct data_unit_t {
	uint8_t sensor_type;
	uint8_t flush_action;
	uint8_t reserve[2];
	uint64_t time_stamp;
	union {
		...
		struct geofence_event_t geofence_data_t;
		struct sar_event_t sar_event;
#ifdef CONFIG_SENSORHUB_XJH_HARDWARE_INFO
		int32_t data[14];
#else
 		int32_t data[8];
#endif
	};
} __packed;

在2.0代码中没有看到struct SCP_SENSOR_HUB_REQ和struct SCP_SENSOR_HUB_SET_CUST_REQ进行强制转换,所以也可以不对前者做修改,但是scp侧两者是有强制转换的代码,所以这里增加此处修改,可以自行验证。struct data_unit_t结构体做修改是为了和SENSOR_DATA_SIZE保持相等。

SCP侧实现

有了AP侧的一些经验,下面就直接添加结构:

//vendor\mediatek\proprietary\tinysys\scp\middleware\contexthub\contexthub_fw.h
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
#define SENSOR_IPI_SIZE 72
#else
#define SENSOR_IPI_SIZE 48
#endif

#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
#define SENSOR_DATA_SIZE 68
#else
#define SENSOR_DATA_SIZE 44
#endif

typedef struct {
    uint8_t    sensorType;
    uint8_t    action;
    uint8_t    event;
    uint8_t    reserve;
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
    uint32_t   data[17];
#else
     uint32_t   data[11];
#endif
} SCP_SENSOR_HUB_REQ;

typedef enum {
    CUST_ACTION_SET_CUST = 1,
	...
    CUST_ACTION_GET_SENSOR_INFO,
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
    CUST_ACTION_GET_XJH_HARDWARE_INFO,
#endif
} CUST_ACTION;

#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
struct sensor_hardware_info_t {
	char chip[16];
	char vendor[16];
	char id[16];
	char more[16];
};

typedef struct {
    CUST_ACTION action;
    union {
        int32_t int32_data[0];
        struct sensor_hardware_info_t xjhSensorInfo;
    };
} SCP_SENSOR_HUB_GET_XJH_SENSOR_INFO;
#endif 

typedef struct {
    union {
		...
        SCP_SENSOR_HUB_GET_SENSOR_INFO  getInfo;
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
        SCP_SENSOR_HUB_GET_XJH_SENSOR_INFO getXjhSensorInfo;
#endif 
    };
} CUST_SET_REQ, *CUST_SET_REQ_P;

这些结构和AP侧基本一样的,不做过多说明。

下面在scp源码中搜索CUST_ACTION_GET_SENSOR_INFO宏命令,在下面加入自己的代码:

//vendor\mediatek\proprietary\tinysys\scp\middleware\contexthub\contexthub_fw.c
static int contextHubDispatchCust(uint8_t sensType, uint32_t sequence,
        SCP_SENSOR_HUB_REQ *req)
{
    int ret = 0;
    SCP_SENSOR_HUB_SET_CUST_REQ *set_cust_req = (SCP_SENSOR_HUB_SET_CUST_REQ *)req;
    CUST_SET_REQ_P cust_req = &set_cust_req->cust_set_req;

    switch (cust_req->cust.action) {
        case CUST_ACTION_SET_TRACE:
            ret = sensorCoreSetDebugTrace(sensType, sequence, req, contextHubIpiRxAck);
            break;
        case CUST_ACTION_GET_SENSOR_INFO:
            ret = sensorCoreGetSensorInfo(sensType, sequence, req, contextHubIpiRxAck);
            break;
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
        case CUST_ACTION_GET_XJH_HARDWARE_INFO:
            ret = sensorCoreGetSensorHardwareInfo(sensType, sequence, req, contextHubIpiRxAck);
            break;
#endif
        default:
            ret = -1;
            break;
    }
    return ret;
}

static int contextHubFwSetCustAck(SCP_SENSOR_HUB_REQ *req,
        SCP_SENSOR_HUB_DATA *rsp, void *data, int errCode)
{
    SCP_SENSOR_HUB_SET_CUST_REQ *set_cust_req = (SCP_SENSOR_HUB_SET_CUST_REQ *)req;
    CUST_SET_REQ_P cust_req = &set_cust_req->cust_set_req;

    rsp->set_cust_rsp.sensorType = req->sensorType;
    rsp->set_cust_rsp.action = req->action;
    rsp->rsp.errCode = errCode;

    switch (cust_req->cust.action) {
        case CUST_ACTION_SET_TRACE:
           rsp->set_cust_rsp.cust_set_rsp.setTrace.action =
               set_cust_req->cust_set_req.setTrace.action;
            break;
        case CUST_ACTION_GET_SENSOR_INFO:
            rsp->set_cust_rsp.cust_set_rsp.getInfo.action =
                set_cust_req->cust_set_req.getInfo.action;
            memcpy(&rsp->set_cust_rsp.cust_set_rsp.getInfo.sensorInfo,
                data, sizeof(struct sensorInfo_t));
            break;
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
        case CUST_ACTION_GET_XJH_HARDWARE_INFO:
            rsp->set_cust_rsp.cust_set_rsp.getXjhSensorInfo.action =
                set_cust_req->cust_set_req.getXjhSensorInfo.action;
            memcpy(&rsp->set_cust_rsp.cust_set_rsp.getXjhSensorInfo.xjhSensorInfo,
                data, sizeof(struct sensor_hardware_info_t));
            break;
#endif
        default:
            break;
    }
    return 0;
}

其中sensorCoreGetSensorHardwareInfo函数是需要自行定义的,可以参考sensorCoreGetSensorInfo函数。

//vendor\mediatek\proprietary\tinysys\scp\middleware\contexthub\contexthub_core.c
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
int sensorCoreGetSensorHardwareInfo(uint8_t sensType, uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
        int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int))
{
    struct sensorCoreInfo *mCoreInfo;

    int8_t handle = mSensorCoreList[sensType];

    if (!atomicBitsetGetBit(mSensorCoreUsed, handle))
        return -1;
    mCoreInfo = &mInfoCoreList[handle];

    if (!mCoreInfo->getSensorHardwareInfo)
        return -1;
    mCoreInfo->getSensorHardwareInfo(sequence, req, ack);
    return 0;
}
#endif

上述代码中还需定义struct sensorCoreInfo结构体成员getSensorHardwareInfo,同样可根据成员getSensorInfo来定义。

//vendor\mediatek\proprietary\tinysys\scp\middleware\contexthub\contexthub_core.h
struct sensorCoreInfo {
    uint8_t sensType;
    ...
    void (*getSensorInfo)(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
        int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int));
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
    void (*getSensorHardwareInfo)(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
        int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int));
#endif
};

#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
int sensorCoreGetSensorHardwareInfo(uint8_t sensType, uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
        int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int));
#endif

定义完后,需要把接口添加到框架中

//\vendor\mediatek\proprietary\tinysys\scp\middleware\contexthub\MEMS_Driver\alsps\alsps.c
static int psInitDone(const uint8_t *data, int size)
{
    struct sensorCoreInfo mInfo;
	...
    /* Register sensor Core */
    mInfo.sensType = SENS_TYPE_PROX;
    mInfo.getData = psGetData;
    mInfo.getSensorInfo = psGetSensorInfo;
    sensorCoreRegister(&mInfo);
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
    mInfo.getSensorHardwareInfo = getSensorHardwareInfo;
#endif
    return 0;
}

#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
static void getSensorHardwareInfo(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
        int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int))
{
    struct broadcast_message *bm = sensor_prepare_event();
    struct factory_param *send = (struct factory_param *)bm->buffer;
    SCP_SENSOR_HUB_SET_CUST_REQ *set_cust_req = (SCP_SENSOR_HUB_SET_CUST_REQ *)req;
    CUST_SET_REQ_P cust_req = &set_cust_req->cust_set_req;

    send->sequence = sequence;
    send->action = req->action;
    send->subaction = cust_req->cust.action;
    send->req = req;
    send->ack = ack;
    sensor_broadcast_event(deputy, bm, SENS_TYPE_PROX, EVENT_FACTORY, sizeof(*send));
}
#endif

static int psFactoryDone(const uint8_t *data, int size)
{
    struct data_unit_t factory_data;
    struct factory_param *recv = (struct factory_param *)data;

    memset(&factory_data, 0, sizeof(factory_data));
    switch (recv->action) {
        case SENSOR_HUB_GET_DATA:
            factory_data.value[0] = recv->data[0];
            recv->ack(recv->sequence, recv->req, &factory_data, 0);
            break;

        case SENSOR_HUB_SET_CUST:
            if (recv->subaction == CUST_ACTION_GET_SENSOR_INFO) {
                recv->ack(recv->sequence, recv->req, recv->data, 0);
            }
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
            if (recv->subaction == CUST_ACTION_GET_XJH_HARDWARE_INFO) {
                recv->ack(recv->sequence, recv->req, (uint32_t *)recv->data[0], 0);
            }
#endif
            break;
        default:
            break;
    }
    return 0;
}

到这里,框架中需要的代码就都添加完成了。后续就是如何在驱动中填写数据。

//vendor\mediatek\proprietary\tinysys\scp\middleware\contexthub\MEMS_Driver\alsps\stk3a5x.c
#ifdef CFG_SENSORHUB_COOLPAD_HARDWARE_INFO
struct sensor_hardware_info_t  stk3a5x_hardware_info;
#endif
static int stk3a5x_ps_factory(const uint8_t *data, int size)
{
    struct factory_param *recv = (struct factory_param *)data;
    struct sensorInfo_t *info;
    struct broadcast_message *bm = NULL;
    struct factory_param *send = NULL;
    osLog(LOG_INFO, "%s[%d]\n", __func__,__LINE__);
    switch (recv->action)
    {
		...
        case SENSOR_HUB_SET_CUST:
            if (recv->subaction == CUST_ACTION_GET_SENSOR_INFO)
            {
                bm = sensor_prepare_event();
                send = (struct factory_param *)bm->buffer;
                memcpy(send, recv, sizeof(*send));
                info = (struct sensorInfo_t*)send->data;
                strncpy(info->name, PS_NAME, sizeof(info->name));
                return sensor_broadcast_event(principal, bm, SENS_TYPE_PROX, EVENT_FACTORY_DONE, sizeof(*send));
            }
#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
            if (recv->subaction == CUST_ACTION_GET_XJH_HARDWARE_INFO)
            {
                bm = sensor_prepare_event();
                send = (struct factory_param *)bm->buffer;
                memcpy(send, recv, sizeof(*send));
                send->data[0] = (uint32_t)&stk3a5x_hardware_info;
				strncpy(stk3a5x_hardware_info.chip, "STK33562", sizeof(stk3a5x_hardware_info.chip)-1);
				strncpy(stk3a5x_hardware_info.vendor, "sensortek", sizeof(stk3a5x_hardware_info.vendor)-1);
				snprintf(stk3a5x_hardware_info.id,  sizeof(stk3a5x_hardware_info.id)-1, "%d-%04x", stk3a5x_dev.hw->i2c_num, stk3a5x_dev.i2c_addr);
				strncpy(stk3a5x_hardware_info.more, "ALSPS", sizeof(stk3a5x_hardware_info.more)-1);
                return sensor_broadcast_event(principal, bm, SENS_TYPE_PROX, EVENT_FACTORY_DONE, sizeof(*send));
            }
#endif
            return 0;
        default:
            return 0;
    }
    return 0;
}

这里没有直接使用广播事件传输数据,而是直接传递的数据地址,原因是广播数据的大小限制为64byte,因此需要去做一些修改,这里为了方便,未去做修改。

下面再给出一段1.0框架的修改做参考:

diff --git a/middleware/contexthub/MEMS_Driver/accGyro/icm4n607.c b/middleware/contexthub/MEMS_Driver/accGyro/icm4n607.c
index 1bd0b0d..5b39c01 100755
--- a/middleware/contexthub/MEMS_Driver/accGyro/icm4n607.c
+++ b/middleware/contexthub/MEMS_Driver/accGyro/icm4n607.c
@@ -3777,6 +3777,23 @@ static void accGetSensorInfo(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
     ack(sequence, req, &info, 0);
 }
 
+#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
+static void accgetSensorHardwareInfo(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
+        int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int))
+{
+    struct sensor_hardware_info_t  acc_hardware_info;
+    memset(&acc_hardware_info, 0, sizeof(acc_hardware_info));
+    
+    strncpy(acc_hardware_info.chip, "ICM-42607-P", sizeof(acc_hardware_info.chip)-1);
+    strncpy(acc_hardware_info.vendor, "TDK invensense", sizeof(acc_hardware_info.vendor)-1);
+    snprintf(acc_hardware_info.id,  sizeof(acc_hardware_info.id)-1, "%d", mTask.hw->i2c_num);
+    strncpy(acc_hardware_info.more, "ACCEL", sizeof(acc_hardware_info.more)-1);
+
+    ack(sequence, req, &acc_hardware_info, 0);
+}
+#endif
+
+
 static void gyroGetSensorInfo(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
         int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int))
 {
@@ -3788,6 +3805,22 @@ static void gyroGetSensorInfo(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
     ack(sequence, req, &info, 0);
 }
 
+#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
+static void gyrogetSensorHardwareInfo(uint32_t sequence, SCP_SENSOR_HUB_REQ *req,
+        int (*ack)(uint32_t, SCP_SENSOR_HUB_REQ *, void *, int))
+{
+    struct sensor_hardware_info_t  gyro_hardware_info;
+    memset(&gyro_hardware_info, 0, sizeof(gyro_hardware_info));
+    
+    strncpy(gyro_hardware_info.chip, "ICM-42607-P", sizeof(gyro_hardware_info.chip)-1);
+    strncpy(gyro_hardware_info.vendor, "TDK invensense", sizeof(gyro_hardware_info.vendor)-1);
+    snprintf(gyro_hardware_info.id,  sizeof(gyro_hardware_info.id)-1, "%d", mTask.hw->i2c_num);
+    strncpy(gyro_hardware_info.more, "GYRO", sizeof(gyro_hardware_info.more)-1);
+
+    ack(sequence, req, &gyro_hardware_info, 0);
+}
+#endif
+
 static void sensorCoreRegistration(void)
 {
     struct sensorCoreInfo mInfo;
@@ -3804,6 +3837,9 @@ static void sensorCoreRegistration(void)
     mInfo.getData = accGetData;
     mInfo.setDebugTrace = ICM4N607SetDebugTrace;
     mInfo.getSensorInfo = accGetSensorInfo;
+#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
+    mInfo.getSensorHardwareInfo = accgetSensorHardwareInfo;
+#endif
     sensorCoreRegister(&mInfo);
 
     memset(&mInfo, 0x00, sizeof(struct sensorCoreInfo));
@@ -3815,6 +3851,9 @@ static void sensorCoreRegistration(void)
    // mInfo.setCalibration = gyroSetCalibration;
     mInfo.getData = gyroGetData;
     mInfo.getSensorInfo = gyroGetSensorInfo;
+#ifdef CFG_SENSORHUB_XJH_HARDWARE_INFO
+    mInfo.getSensorHardwareInfo = gyrogetSensorHardwareInfo;
+#endif
     sensorCoreRegister(&mInfo);
 }

-----欢迎点赞,收藏和关注------

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
全志R16的tinav2.1下调通AP6181的步骤.txt 思路:由于tinav2.1的SDK在全志R16的开发板SC3817上是可以使用AP6212A0的WIFI功能的。 由此证明:SC3817的开发板的WIFI的硬件部分正常。我拿到的tinav2.1的SDK正常。 由于在驱动lichee中,WIFI通过读取ID号自动加载固件的。 因此只需要把AP6181A2的固件放到AP6212的目录下,并适当修改配置文件/做出相应的修改。 就可以让tinav2.1在上电启动的时候,通过自动识别AP6181A2来加载其固件了。 1、使用AP6212原厂/代理商提供的固件在android4.4.2 parrotv1.1下调通AP6181: (如果没有这个文件,可以生成WLAN0节点,但是不能连网) R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\firmware\ap6212\config.txt (这个文件没用) R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\firmware\ap6212\device-bcm.mk R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\firmware\ap6212\fw_bcm40181a2.bin R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\firmware\ap6212\fw_bcm40181a2_apsta.bin R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\firmware\ap6212\fw_bcm40181a2_p2p.bin R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\firmware\ap6212\nvram_ap6181.txt 2、 R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\firmware\linux-firmware\broadcom.mk Package/ap6212-firmware = $(call Package/firmware-default,Broadcom AP6212 firmware) define Package/ap6212-firmware/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) \ $(TOPDIR)/package/firmware/ap6212/*.bin \ $(1)/lib/firmware/ $(INSTALL_DATA) \ $(TOPDIR)/package/firmware/ap6212/*.hcd \ $(1)/lib/firmware/ $(INSTALL_DATA) \ $(TOPDIR)/package/firmware/ap6212/nvram_ap6212.txt \ $(1)/lib/firmware/nvram.txt endef $(eval $(call BuildPackage,ap6212-firmware)) 修改为: Package/ap6212-firmware = $(call Package/firmware-default,Broadcom AP6212 firmware) define Package/ap6212-firmware/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) \ $(TOPDIR)/package/firmware/ap6212/*.bin \ $(1)/lib/firmware/ $(INSTALL_DATA) \ $(TOPDIR)/package/firmware/ap6212/*.hcd \ $(1)/lib/firmware/ $(INSTALL_DATA) \ $(TOPDIR)/package/firmware/ap6212/nvram_ap6181.txt \ $(1)/lib/firmware/nvram.txt $(INSTALL_DATA) \ $(TOPDIR)/package/firmware/ap6212/config.txt \ $(1)/lib/firmware/config.txt endef $(eval $(call BuildPackage,ap6212-firmware)) 3、 R:\wyb\ap6181+ap6212a0_r16_tinav2.1\target\allwinner\astar-parrot\configs\sys_config.fex [wakeup_src_para] cpu_en = 0 cpu_freq = 48 ; (cpu:apb:ahb) pll_ratio = 0x111 dram_selfresh_en= 1 dram_freq = 36 wakeup_src_wl = port:PL07<4><default><default><0> wakeup_src_bt = port:PL09<4><default><default><0> bb_wake_ap = port:PL02<4><default><default><0> 修改为: [wakeup_src_para] cpu_en = 0 cpu_freq = 48 ; (cpu:apb:ahb) pll_ratio = 0x111 dram_selfresh_en= 1 dram_freq = 36 ;wakeup_src_wl = port:PL07<4><default><default><0> wakeup_src_wl = port:PG09<4><default><default><0> ;wakeup_src_bt = port:PL09<4><default><default><0> bb_wake_ap = port:PL02<4><default><default><0> [rf_para] module_num = 10 module_power1 = "axp22_dldo1" module_power1_vol = 3300000 module_power2 = "axp22_dldo2" module_power2_vol = 3300000 module_power3 = "axp22_aldo1" module_power3_vol = 3300000 power_switch = chip_en = lpo_use_apclk = "losc_out" 修改为: [rf_para] module_num = 1 module_power1 = "axp22_dldo1" module_power1_vol = 3300000 module_power2 = "axp22_dldo2" module_power2_vol = 3300000 module_power3 = "axp22_aldo1" module_power3_vol = 3300000 power_switch = chip_en = lpo_use_apclk = "losc_out" [wifi_para] wifi_used = 1 wifi_sdc_id = 1 wifi_usbc_id = 1 wifi_usbc_type = 1 wl_reg_on = port:PL06<1><default><default><0> wl_host_wake = port:PL07<4><default><default><0> 修改为: [wifi_para] wifi_used = 1 wifi_sdc_id = 1 wifi_usbc_id = 1 wifi_usbc_type = 1 ;wl_reg_on = port:PL06<1><default><default><0> ;wl_host_wake = port:PL07<4><default><default><0> wl_reg_on = port:PG06<1><default><default><0> wl_host_wake = port:PG09<4><default><default><0> wl_host_wake_invert = 0 AP6181没有蓝牙功能,直接关闭。 [bt_para] bt_used = 0 ;bt_uart_id = 1 ;bt_rst_n = port:PL08<1><default><default><0> ;bt_wake = port:PL10<1><default><default><0> ;bt_host_wake = port:PL09<4><default><default><0> ;bt_host_wake_invert = 0 4、编译系统: rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ source build/envsetup.sh including target/allwinner/tulip-d1/vendorsetup.sh including target/allwinner/azalea-evb/vendorsetup.sh including target/allwinner/octopus-sch/vendorsetup.sh including target/allwinner/astar-evb/vendorsetup.sh including target/allwinner/azalea-perf3/vendorsetup.sh including target/allwinner/azalea-perf2/vendorsetup.sh including target/allwinner/azalea-perf1/vendorsetup.sh including target/allwinner/astar-spk/vendorsetup.sh including target/allwinner/generic/vendorsetup.sh including target/allwinner/astar-parrot/vendorsetup.sh including target/allwinner/octopus-dev/vendorsetup.sh rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ lunch You're building on Linux Lunch menu... pick a combo: 1. tulip_d1-tina 2. tulip_d1-dragonboard 3. azalea_evb-tina 4. azalea_evb-dragonboard 5. octopus_sch-tina 6. octopus_sch-dragonboard 7. astar_evb-tina 8. azalea_perf3-tina 9. azalea_perf3-dragonboard 10. azalea_perf2-tina 11. azalea_perf2-dragonboard 12. azalea_perf1-tina 13. azalea_perf1-dragonboard 14. astar_spk-tina 15. astar_spk-dragonboard 16. astar_parrot-tina 17. astar_parrot-dragonboard 18. octopus_dev-tina 19. octopus_dev-dragonboard Which would you like?16 ============================================ PLATFORM_VERSION_CODENAME=Neptune PLATFORM_VERSION=2.0.0 TARGET_PRODUCT=astar_parrot TARGET_BUILD_VARIANT=tina TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=cortex-a7 TARGET_2ND_ARCH= TARGET_2ND_ARCH_VARIANT= TARGET_2ND_CPU_VARIANT= HOST_ARCH=x86_64 HOST_OS=linux HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty HOST_BUILD_TYPE=release BUILD_ID=57513AA3 OUT_DIR= ============================================ rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ make -j8 rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ pack -d 5、打开WIFI连接的应用程序: Tina wifimanager API_V2.0.pdf WIFI管理的API接口文档 rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ make menuconfig Allwinner ---> -*- wifimanager............................................ Tina wifi manager ---> --- wifimanager............................................ Tina wifi manager (选中) <*> wifimanager-demo...................................... Tina wifi app demo R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\allwinner\wifimanager\demo\wifi_on_off_test.c R:\wyb\ap6181+ap6212a0_r16_tinav2.1\package\allwinner\wifimanager\demo\wifi_connect_ap.cpp 编译之后,R16的TINAV2.1的系统的/bin中会有: root@TinaLinux:/bin# ll w* lrwxrwxrwx 1 root root 13 Oct 19 14:22 wget -> uclient-fetch -rwxr-xr-x 1 root root 4102 Oct 19 14:12 wifi_connect_ap_test -rwxr-xr-x 1 root root 4102 Oct 19 14:12 wifi_on_off_test root@TinaLinux:/bin# /* *argc[1] ap ssid *argc[2] ap passwd */ int main(int argv, char *argc[]){ wifi_connect_ap.cpp的main函数嵌可以看见第一个参数为SSID,第二参数为密码,中间用空格隔开即可。 WIFI连接之前: root@TinaLinux:/# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:20 errors:0 dropped:0 overruns:0 frame:0 TX packets:20 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1572 (1.5 KiB) TX bytes:1572 (1.5 KiB) wlan0 Link encap:Ethernet HWaddr 94:A1:A2:C4:E3:12 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) root@TinaLinux:/# WIFI连接: root@TinaLinux:/bin# root@TinaLinux:/bin# ./wifi_connect_ap_test citybrand-2 citybrand200903 ********************************* ***Start wifi connect ap test!*** ********************************* event_label 0x0 WiFi on success! do cmd LIST_NETWORKS call event 0xf004 do cmd SCAN event_label 0x0 It has no wifi auto connect when wifi on! aw wifi connect state 0xf0 enter get_key_mgmt, ssid citybrand-2 scan stauts 1 do cmd SCAN_RESULTS ssid citybrand-2, flag [WPA2-PSK-CCMP][ESS] do cmd LIST_NETWORKS do cmd ADD_NETWORK do cmd SET_NETWORK 0 ssid "citybrand-2" do cmd SET_NETWORK 0 key_mgmt WPA-PSK do cmd SET_NETWORK 0 psk "citybrand200903" do cmd LIST_NETWORKS do cmd GET_NETWORK 0 priority do cmd SET_NETWORK 0 priority 1 do cmd SELECT_NETWORK 0 do cmd RECONNECT do cmd LIST_NETWORKS connecting id 0, connected id 0 Unknown HZ value! (-1) Assume 1241 ttyS0 15049-12:58:15 udhcpc_wlan0 Command failed: Not found Unknown HZ value! (-1) Assume 1241 ttyS0 15049-12:58:15 udhcpc_wlan0 do cmd SAVE_CONFIG do cmd LIST_NETWORKS do cmd ENABLE_NETWORK 0 do cmd SAVE_CONFIG wifi state busing,waiting vflag= 4 call event 0xf00b event_label 0x1 WiFi connected ap! ****************************** Wifi connect ap test: Success! ****************************** root@TinaLinux:/bin# root@TinaLinux:/bin# root@TinaLinux:/bin# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:40 errors:0 dropped:0 overruns:0 frame:0 TX packets:40 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3116 (3.0 KiB) TX bytes:3116 (3.0 KiB) wlan0 Link encap:Ethernet HWaddr 94:A1:A2:C4:E3:12 inet addr:192.168.0.167 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:34 errors:0 dropped:0 overruns:0 frame:0 TX packets:25 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3084 (3.0 KiB) TX bytes:2516 (2.4 KiB) root@TinaLinux:/bin# root@TinaLinux:/bin# 6、R16的TINAV2.0平台的SSH连接 rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ make menuconfig Base system ---> (选中这里) <*> dropbear........................................ Small SSH2 client/server Configuration ---> [*] Curve25519 support (NEW) (这里不用选中) [ ] Elliptic curve cryptography (ECC) (NEW) 7、再次编译系统打包刷机之后以SCP方式远程登陆R16的tinav2.1: rootroot@cm-System-Product-Name:/home/wwt/parrot_r16_tinav2.0$ make -j12 rootroot@cm-System-Product-Name:/home/wwt/parrot_r16_tinav2.0$ pack -d 在串口终端中输入(必须设置root用户的密码): root@TinaLinux:/bin# root@TinaLinux:/bin# passwd Changing password for root New password: Bad password: too short Retype password: Password for root changed by root root@TinaLinux:/bin# root@TinaLinux:/bin# SSH连接工具使用:WinSCP_5.9.0.6786_Setup.exe 文件协议选择:SCP 主机名:192.168.0.167(根据你的R16的实际IP修改) 端口号:22 用户名:root 密码:root 点击 登陆 即可。 如果重新刷机,IP地址不变,但是RSA密码改变,选择 更新 即可。 8、在ubuntu14.04中文版下通过SSH访问R16的tinav2.1: (注意刚登陆的地方是空的根目录) rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ rootroot@rootroot-E400:~/wyb/ap6181+ap6212a0_r16_tinav2.1$ ssh root@192.168.0.108 root@192.168.0.108's password: BusyBox v1.24.1 () built-in shell (ash) _____ _ __ _ |_ _||_| ___ _ _ | | |_| ___ _ _ _ _ | | _ | || | | |__ | || || | ||_'_| | | | || | || _ | |_____||_||_|_||___||_,_| |_| |_||_|_||_|_| Tina is Based on OpenWrt! ---------------------------------------------- Tina Linux (Neptune, 57513AA3) ---------------------------------------------- root@TinaLinux:~# ll drwxr-xr-x 2 root root 3 Dec 22 20:11 . drwxr-xr-x 1 root root 1024 Dec 23 2016 .. root@TinaLinux:~# pwd /root root@TinaLinux:~# cd / root@TinaLinux:/# ll drwxr-xr-x 1 root root 1024 Dec 23 2016 . drwxr-xr-x 1 root root 1024 Dec 23 2016 .. drwxr-xr-x 2 root root 984 Dec 22 20:11 bin drwxrwxrwx 2 root root 16384 Jan 1 1970 boot drwxrwxrwx 2 root root 8192 Jan 1 1970 boot-res -rw-r--r-- 1 root root 441 Dec 23 2016 bt_config.xml drwxr-xr-x 9 root root 2900 Dec 23 2016 dev drwxr-xr-x 1 root root 1024 Dec 23 11:33 etc drwxr-xr-x 10 root root 661 Dec 22 19:38 lib drwx------ 2 root root 12288 Dec 23 2016 lost+found drwxr-xr-x 1 root root 1024 Dec 23 2016 mnt drwxr-xr-x 7 root root 1024 Dec 23 2016 overlay dr-xr-xr-x 88 root root 0 Jan 1 1970 proc drwxr-xr-x 16 root root 211 Dec 22 20:11 rom drwxr-xr-x 2 root root 3 Dec 22 20:11 root drwxr-xr-x 2 root root 689 Dec 22 20:11 sbin dr-xr-xr-x 12 root root 0 Dec 23 2016 sys drwxrwxrwt 9 root root 300 Dec 23 2016 tmp drwxr-xr-x 7 root root 101 Dec 22 19:50 usr lrwxrwxrwx 1 root root 4 Dec 22 20:11 var -> /tmp drwxr-xr-x 2 root root 3 Dec 22 20:11 www root@TinaLinux:/#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值