杰理学习(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、蓝牙连接
  • 二、适配硬件
      • 1、3212光电
      • 2.灯和侧键

一、蓝牙连接

蓝牙名字修改,还有一些广播 pid 什么的在 ble_hogp.c

改个名字 这里0x09是是设备完整名称。更多修改可以搜下面这些

广播类型结构体

/*eir packet_type*/
typedef enum {
    HCI_EIR_DATATYPE_FLAGS =                                                 0x01,
    HCI_EIR_DATATYPE_MORE_16BIT_SERVICE_UUIDS =                              0x02,
    HCI_EIR_DATATYPE_COMPLETE_16BIT_SERVICE_UUIDS =                          0x03,
    HCI_EIR_DATATYPE_MORE_32BIT_SERVICE_UUIDS =                              0x04,
    HCI_EIR_DATATYPE_COMPLETE_32BIT_SERVICE_UUIDS =                          0x05,
    HCI_EIR_DATATYPE_MORE_128BIT_SERVICE_UUIDS =                             0x06,
    HCI_EIR_DATATYPE_COMPLETE_128BIT_SERVICE_UUIDS =                         0x07,
    HCI_EIR_DATATYPE_SHORTENED_LOCAL_NAME =                                  0x08,
    HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME =                                   0x09,
    HCI_EIR_DATATYPE_TX_POWER_LEVEL =                                        0x0A,
    HCI_EIR_DATATYPE_CLASS_OF_DEVICE =                                       0x0D,
    HCI_EIR_DATATYPE_SIMPLE_PAIRING_HASH_C =                                 0x0E,
    HCI_EIR_DATATYPE_SIMPLE_PAIRING_RANDOMIZER_R =                           0x0F,
    HCI_EIR_DATATYPE_SECURITY_MANAGER_TK_VALUE =                             0x10,
    HCI_EIR_DATATYPE_SECURITY_MANAGER_OOB_FLAGS =                            0x11,
    HCI_EIR_DATATYPE_SLAVE_CONNECTION_INTERVAL_RANGE =                       0x12,
    HCI_EIR_DATATYPE_16BIT_SERVICE_SOLICITATION_UUIDS =                      0x14,
    HCI_EIR_DATATYPE_128BIT_SERVICE_SOLICITATION_UUIDS =                     0x15,
    HCI_EIR_DATATYPE_SERVICE_DATA =                                          0x16,
    HCI_EIR_DATATYPE_APPEARANCE_DATA =                                       0x19,
    HCI_EIR_DATATYPE_MANUFACTURER_SPECIFIC_DATA =                            0xFF
} HCI_EIR_datatype_t;

广播包函数


//按(长度 + 类型 + 内容)这样的格,组合填入广播包数据
static inline u8 make_eir_packet_data(u8 *buf, u16 offset, u8 data_type, u8 *data, u8 data_len)
{
    if (ADV_RSP_PACKET_MAX - offset < data_len + 2) {
        return offset + data_len + 2;
    }

    buf[0] = data_len + 1;
    buf[1] = data_type;
    memcpy(buf + 2, data, data_len);
    return data_len + 2;
}

修改名字的地方

/*************************************************************************************************/
/*!
 *  \brief      配置gatt name
 *
 *  \param      [in]
 *
 *  \return
 *
 *  \note      没开 scan & adv 状态下可修改
 */
/*************************************************************************************************/
static char ble_device_name[BT_NAME_LEN_MAX + 1] = "LHJ_MOUSE(BLE)";
static u8 ble_device_name_len = 14; //名字长度,不包含结束符
static const char ble_ext_name[] = "(BLE)";
void ble_comm_set_config_name(const char *name_p, u8 add_ext_name)
{
    log_info("%s\n", __FUNCTION__);

    if (!name_p) {
        log_info("ble default name(%d): %s\n", ble_device_name_len, ble_device_name);
        return;
    }

    ble_device_name_len = strlen(name_p);
    if (ble_device_name_len > BT_NAME_LEN_MAX) {
        log_error("cfg_name overflow!!!\n");
        ble_device_name_len = BT_NAME_LEN_MAX;
    }

	
    //memcpy(ble_device_name, name_p, ble_device_name_len);


    if (add_ext_name) {
        u8 ext_name_len = strlen(ble_ext_name);
        if (ext_name_len + ble_device_name_len > BT_NAME_LEN_MAX) 
		{
            log_error("add_name overflow!!!\n");
        } 
		else 
		{
            memcpy(&ble_device_name[ble_device_name_len], ble_ext_name, ext_name_len);
            ble_device_name_len += ext_name_len;
        }

    }
    ble_device_name[ble_device_name_len] = 0;//结束符
    log_info("ble name(%d): %s \n", ble_device_name_len, ble_device_name);
}

调用的地方

static u8 adv_name_ok = 0; // name优先存放在ADV包

static int hogp_make_set_adv_data(void)
{
    // ...(变量声明)

    // 将各种数据添加到广播数据中
    offset += make_eir_packet_val(&buf[offset], offset, HCI_EIR_DATATYPE_FLAGS, FLAGS_GENERAL_DISCOVERABLE_MODE | FLAGS_EDR_NOT_SUPPORTED, 1);
    offset += make_eir_packet_val(&buf[offset], offset, HCI_EIR_DATATYPE_COMPLETE_16BIT_SERVICE_UUIDS, HID_UUID_16, 2);
    offset += make_eir_packet_data(&buf[offset], offset, HCI_EIR_DATATYPE_APPEARANCE_DATA, Appearance, 2);
    offset += make_eir_packet_data(&buf[offset], offset, HCI_EIR_DATATYPE_MANUFACTURER_SPECIFIC_DATA, (void *)user_tag_string, tag_len);

    // 获取GAP名称
    char *gap_name = ble_comm_get_gap_name();
    u8 name_len = strlen(gap_name);
    u8 valid_len = ADV_RSP_PACKET_MAX - (offset + 2);

    // 检查是否有足够的空间将名称添加到广播数据中
    if (name_len < valid_len) {
        // 将设备名称添加到广播数据中
        offset += make_eir_packet_data(&buf[offset], offset, HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME, (void *)gap_name, name_len);
        adv_name_ok = 1; // 设置标志,表示名称已经添加
    } else {
        adv_name_ok = 0; // 设置标志,表示由于空间不足无法添加名称
    }

    // 检查溢出情况
    if (offset > ADV_RSP_PACKET_MAX) {
        puts("***hogp_adv_data overflow!!!!!!\n");
        return -1;
    }

    // 记录有关广播数据的信息
    log_info("hogp_adv_data(%d):", offset);
    log_info_hexdump(buf, offset);

    // 在服务器中配置广播数据
    hogp_server_adv_config.adv_data_len = offset;
    hogp_server_adv_config.adv_data = hogp_adv_data;

    return 0;
}

这里是代码执行的摘要:

  1. 该函数通过使用 make_eir_packet_valmake_eir_packet_data 函数添加各种类型的数据来构建广播数据(hogp_adv_data)。
  2. 然后,它获取设备的GAP名称。
  3. 它检查广播数据是否有足够的空间来添加设备名称。如果有足够的空间,则将设备名称添加到广播数据中,并将 adv_name_ok 设置为1。如果空间不足,则将 adv_name_ok 设置为0。
  4. 该函数检查是否发生了溢出,并记录有关广播数据的信息。
  5. 最后,它在服务器中配置广播数据。

使用 adv_name_ok 作为标志允许程序的其他部分检查设备名称是否成功添加到广播数据中。

杰理学习(二)_第1张图片

连接 ok

二、适配硬件

1、3212光电

这边的硬件是3212光电,需要一些修改,不然会报错

杰理学习(二)_第2张图片

通过打印得知,光电器件读不到id,TCFG_HAL3205_EN 搜这个宏,然后将3205的光电的代码替换为3212或者增加分支

这是调用的代码


/************************ OPTICAL_MOUSE_SENSOR  config********************/
OMSENSOR_PLATFORM_DATA_BEGIN(OMSensor_data)

#if TCFG_HAL3205_EN
.OMSensor_id      = "hal3205",
#endif  /*  TCFG_HAL3205_EN */
#if TCFG_HAL3212_EN


.OMSensor_id	  = "hal3212",



#endif

 .OMSensor_sclk_io = TCFG_OPTICAL_SENSOR_SCLK_PORT,
 .OMSensor_data_io = TCFG_OPTICAL_SENSOR_DATA_PORT,
 .OMSensor_int_io  = TCFG_OPTICAL_SENSOR_INT_PORT,
  OMSENSOR_PLATFORM_DATA_END();



这里是3212驱动的代码


typedef struct {
    u8 OMSensor_id[20];
    bool(*OMSensor_init)(OMSENSOR_PLATFORM_DATA *);
    bool (*OMSensor_read_motion)(s16 *, s16 *);
    u8(*OMSensor_data_ready)(void);
    u8(*OMSensor_status_dump)(void);
    void (*OMSensor_wakeup)(void);
    void (*OMSensor_led_switch)(u8);
    u16(*OMSensor_set_cpi)(u16 dst_cpi);
} OMSENSOR_INTERFACE;

#define REGISTER_OMSENSOR(OMSensor) \
	static OMSENSOR_INTERFACE OMSensor SEC_USED(.omsensor_dev)



REGISTER_OMSENSOR(optical_mouse_sensor) = {
    .OMSensor_id          = "hal3212",
    .OMSensor_init        = hal_pixart_init,
    .OMSensor_read_motion = hal_pixart_readMotion,
    .OMSensor_data_ready  = hal_pixart_data_ready,
    .OMSensor_status_dump = hal_pixart_status_dump,
    .OMSensor_wakeup = hal_pixart_force_wakeup,
    .OMSensor_led_switch  = hal_pixart_led_switch,
    .OMSensor_set_cpi     = hal_pixart_set_cpi,
};


//初始化代码
static bool hal_pixart_init(OMSENSOR_PLATFORM_DATA *priv)
{
    pdata = priv;

    //初始化GPIO
    hal_pixart_gpio_init();

    //初始化延时,确保初始化成功
    frameDelay();

    //初始化定时器,用以超时检查
    sys_s_hi_timer_add(NULL, time_counter, 20);

    //同步通信检查
    if (!hal_pixart_resync()) {
        goto _init_fail_;
    }

#ifdef EN_PAW3212
    paw3212_init(); //paw3212初始化
#endif
    hal_pixart_info_dump();

    return true;

_init_fail_:
    log_error("optical sensor init fail!!!");
    return false;
}

然后这里面的初始化涉及了一些指针和宏的使用,这种方式使得可以灵活地替换或注册不同的传感器,只需提供相应的初始化信息即可。

部分解释:

u8 OMSensor_id[20];
  • 这是一个包含 20 个元素的数组,类型为 u8(8 位无符号整数),用于存储某种传感器的标识符。
bool (*OMSensor_init)(OMSENSOR_PLATFORM_DATA *);
  • 这是一个函数指针,指向一个返回布尔值的函数,该函数接受一个类型为 OMSENSOR_PLATFORM_DATA 的指针参数。这个函数用于初始化传感器。
bool (*OMSensor_read_motion)(s16 *, s16 *);
  • 同样是一个函数指针,指向一个返回布尔值的函数,该函数接受两个 s16 类型的指针参数,用于读取运动数据。
  1. .OMSensor_id = "hal3212",
    • 设置传感器的标识符为字符串 “hal3212”。
  2. .OMSensor_init = hal_pixart_init,
    • 设置传感器初始化函数的指针为 hal_pixart_init

改完后重新下载,即可读到光电id。

杰理学习(二)_第3张图片

很好,现在鼠标左右中键和光电都可以用了

【图片鼠标晃动】

2.灯和侧键

侧键b4 ,b5那些需要修改hid报表。

你可能感兴趣的:(工作经验,学习)