6021|10

63

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【沁恒RISC-V内核 CH582】CH582 有线键盘转蓝牙键盘 [复制链接]

 
 

CH582 有线键盘转蓝牙键盘

结合USB-HOST和蓝牙HID键盘的例程制作了一个有线键盘转蓝牙键盘的设备,代码如下:

/******************************************************************************/
/* 头文件包含 */
#include "CONFIG.h"
#include "HAL.h"
#include "hiddev.h"
#include "hidkbd.h"

/*********************************************************************
 * GLOBAL TYPEDEFS
 */
__attribute__((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4];
__attribute__((aligned(4))) uint8_t RxBuffer[MAX_PACKET_SIZE]; // IN, must even address
__attribute__((aligned(4))) uint8_t TxBuffer[MAX_PACKET_SIZE]; // OUT, must even address
extern uint8_t need_send;

#if(defined(BLE_MAC)) && (BLE_MAC == TRUE)
const uint8_t MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02};
#endif

/*********************************************************************
 * @fn      Main_Circulation
 *
 * [url=home.php?mod=space&uid=159083]@brief[/url] 主循环
 *
 * [url=home.php?mod=space&uid=784970]@return[/url] none
 */
__HIGH_CODE
void Main_Circulation()
{
    TMOS_SystemProcess();
}

/*********************************************************************
 * @fn      main
 *
 * @brief   主函数
 *
 * @return  none
 */
int main(void)
{
    uint8_t i, s, k, len, endp;
    uint16_t  loc;
#if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)
    PWR_DCDCCfg(ENABLE);
#endif
    SetSysClock(CLK_SOURCE_PLL_60MHz);
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
    GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
    GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
#endif
    /* 开启电压监控 */
    PowerMonitor(ENABLE, HALevel_2V1);
#ifdef DEBUG
    GPIOA_SetBits(bTXD1);
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
    GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
    UART1_DefInit();
#endif
    PRINT("%s\n", VER_LIB);
    CH58X_BLEInit();
    HAL_Init();
    GAPRole_PeripheralInit();
    HidDev_Init();
    HidEmu_Init();

    PRINT("Start @ChipID=%02X\n", R8_CHIP_ID);

    pU2HOST_RX_RAM_Addr = RxBuffer;
    pU2HOST_TX_RAM_Addr = TxBuffer;
    USB2_HostInit();
    PRINT("Wait Device In\n");
    while(1)
    {
        Main_Circulation();
        s = ERR_SUCCESS;
        if(R8_USB2_INT_FG & RB_UIF_DETECT)
        { // 如果有USB主机检测中断则处理
            R8_USB2_INT_FG = RB_UIF_DETECT;
            s = AnalyzeRootU2Hub();
            if(s == ERR_USB_CONNECT)
                FoundNewU2Dev = 1;
        }

        if(FoundNewU2Dev || s == ERR_USB_CONNECT)
        { // 有新的USB设备插入
            FoundNewU2Dev = 0;
            mDelaymS(200);          // 由于USB设备刚插入尚未稳定,故等待USB设备数百毫秒,消除插拔抖动
            s = InitRootU2Device(); // 初始化USB设备
            if(s != ERR_SUCCESS)
            {
                PRINT("EnumAllRootDev err = %02X\n", (uint16_t)s);
            }
        }

        /* 如果下端连接的是HUB,则先枚举HUB */
        s = EnumAllU2HubPort(); // 枚举所有ROOT-HUB端口下外部HUB后的二级USB设备
        if(s != ERR_SUCCESS)
        { // 可能是HUB断开了
            PRINT("EnumAllHubPort err = %02X\n", (uint16_t)s);
        }

        /* 如果设备是键盘 */
        loc = U2SearchTypeDevice(DEV_TYPE_KEYBOARD); // 在ROOT-HUB以及外部HUB各端口上搜索指定类型的设备所在的端口号
        if(loc != 0xFFFF)
        { // 找到了,如果有两个KeyBoard如何处理?
            i = (uint8_t)(loc >> 8);
            len = (uint8_t)loc;
            SelectU2HubPort(len);                                                 // 选择操作指定的ROOT-HUB端口,设置当前USB速度以及被操作设备的USB地址
            endp = len ? DevOnU2HubPort[len - 1].GpVar[0] : ThisUsb2Dev.GpVar[0]; // 中断端点的地址,位7用于同步标志位
            if(endp & USB_ENDP_ADDR_MASK)
            {                                                                                                        // 端点有效
                s = USB2HostTransact(USB_PID_IN << 4 | endp & 0x7F, endp & 0x80 ? RB_UH_R_TOG | RB_UH_T_TOG : 0, 0); // 传输事务,获取数据,NAK不重试
                if(s == ERR_SUCCESS)
                {
                    endp ^= 0x80; // 同步标志翻转
                    if(len)
                        DevOnU2HubPort[len - 1].GpVar[0] = endp; // 保存同步标志位
                    else
                        ThisUsb2Dev.GpVar[0] = endp;
                    len = R8_USB2_RX_LEN; // 接收到的数据长度
                    if(len)
                    {
                        U2SETorOFFNumLock(RxBuffer);

                        PRINT("keyboard data: ");
                        for(i = 0; i < len; i++)
                        {
                            PRINT("x%02X ", (uint16_t)(RxBuffer[i]));
                        }
                        PRINT("\n");
                        need_send = 1;
                    }
                }
                else if(s != (USB_PID_NAK | ERR_USB_TRANSFER))
                {
                    PRINT("keyboard error %02x\n", (uint16_t)s); // 可能是断开了
                }
            }
            else
            {
                PRINT("keyboard no interrupt endpoint\n");
            }
            SetUsb2Speed(1); // 默认为全速
        }
    }
}

/******************************** endfile @ main ******************************/

设置need_send全局变量作为标志位,对于蓝牙HID线程修改如下:

    if(events & START_REPORT_EVT)
    {
        if (need_send) {
            HidDev_Report(HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT,
                          HID_KEYBOARD_IN_RPT_LEN, RxBuffer);
            need_send = 0;
        }
        tmos_start_task(hidEmuTaskId, START_REPORT_EVT, 1);
        return (events ^ START_REPORT_EVT);
    }

将HID线程的周期改为1ms来提高蓝牙键盘的速度。

实物:

 

最新回复

万分感谢!键盘成功了,我在研究看看鼠标。哈哈哈   详情 回复 发表于 2024-9-10 22:26
点赞 关注(1)
 
 

回复
举报

5260

帖子

239

TA的资源

管理员

沙发
 

用起来效果怎么样?来个视频秀一下哇

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

6960

帖子

11

TA的资源

版主

板凳
 
背一个充电宝,大材小用了,楼主继续,把功耗控制好,期待能实现一节干电池供电
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

4
 

你好!特殊的按键可以正确使用吗?我的小键盘的=号,为什么不能正确显示按键代码?

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 

可以上传一下工程吗

 
 
 

回复

63

帖子

2

TA的资源

一粒金砂(中级)

6
 
Frieren 发表于 2022-12-15 11:24 可以上传一下工程吗
KBD2BLE.zip (2.57 MB, 下载次数: 152)
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

7
 

测试了一下,手上大部分键盘都可以,但是有一款键盘不行,是一个京东京造机械键盘,这个设备插上去会枚举出多个设备,不知道是不是和这个有关。

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 

怎么接线的看不清图片


 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

9
 

有编译好可以直接用的固件吗

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

10
 

WCH的USB带蓝牙功能不错

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 

万分感谢!键盘成功了,我在研究看看鼠标。哈哈哈

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表