提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
蓝牙名字修改,还有一些广播 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;
}
这里是代码执行的摘要:
make_eir_packet_val
和 make_eir_packet_data
函数添加各种类型的数据来构建广播数据(hogp_adv_data
)。adv_name_ok
设置为1。如果空间不足,则将 adv_name_ok
设置为0。使用 adv_name_ok
作为标志允许程序的其他部分检查设备名称是否成功添加到广播数据中。
连接 ok
这边的硬件是3212光电,需要一些修改,不然会报错
通过打印得知,光电器件读不到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];
u8
(8 位无符号整数),用于存储某种传感器的标识符。bool (*OMSensor_init)(OMSENSOR_PLATFORM_DATA *);
OMSENSOR_PLATFORM_DATA
的指针参数。这个函数用于初始化传感器。bool (*OMSensor_read_motion)(s16 *, s16 *);
s16
类型的指针参数,用于读取运动数据。.OMSensor_id = "hal3212",
.OMSensor_init = hal_pixart_init,
hal_pixart_init
。改完后重新下载,即可读到光电id。
很好,现在鼠标左右中键和光电都可以用了
【图片鼠标晃动】
侧键b4 ,b5那些需要修改hid报表。