pomin 发表于 2022-4-7 00:15

【沁恒RISC-V内核 CH582】CH582 有线键盘转蓝牙键盘

<div class="parsedown-markdown">
<h2>CH582 有线键盘转蓝牙键盘</h2>

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

<pre>
<code class="language-cpp">/******************************************************************************/
/* 头文件包含 */
#include "CONFIG.h"
#include "HAL.h"
#include "hiddev.h"
#include "hidkbd.h"

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

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

/*********************************************************************
* @fn      Main_Circulation
*
* @brief 主循环
*
* @return none
*/
__HIGH_CODE
void Main_Circulation()
{
    TMOS_SystemProcess();
}

/*********************************************************************
* @fn      main
*
* @brief   主函数
*
* @returnnone
*/
int main(void)
{
    uint8_t i, s, k, len, endp;
    uint16_tloc;
#if(defined(DCDC_ENABLE)) &amp;&amp; (DCDC_ENABLE == TRUE)
    PWR_DCDCCfg(ENABLE);
#endif
    SetSysClock(CLK_SOURCE_PLL_60MHz);
#if(defined(HAL_SLEEP)) &amp;&amp; (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 &amp; 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 &gt;&gt; 8);
            len = (uint8_t)loc;
            SelectU2HubPort(len);                                                 // 选择操作指定的ROOT-HUB端口,设置当前USB速度以及被操作设备的USB地址
            endp = len ? DevOnU2HubPort.GpVar : ThisUsb2Dev.GpVar; // 中断端点的地址,位7用于同步标志位
            if(endp &amp; USB_ENDP_ADDR_MASK)
            {                                                                                                      // 端点有效
                s = USB2HostTransact(USB_PID_IN &lt;&lt; 4 | endp &amp; 0x7F, endp &amp; 0x80 ? RB_UH_R_TOG | RB_UH_T_TOG : 0, 0); // 传输事务,获取数据,NAK不重试
                if(s == ERR_SUCCESS)
                {
                  endp ^= 0x80; // 同步标志翻转
                  if(len)
                        DevOnU2HubPort.GpVar = endp; // 保存同步标志位
                  else
                        ThisUsb2Dev.GpVar = endp;
                  len = R8_USB2_RX_LEN; // 接收到的数据长度
                  if(len)
                  {
                        U2SETorOFFNumLock(RxBuffer);

                        PRINT("keyboard data: ");
                        for(i = 0; i &lt; len; i++)
                        {
                            PRINT("x%02X ", (uint16_t)(RxBuffer));
                        }
                        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 ******************************/
</code></pre>

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

<pre>
<code class="language-c">    if(events &amp; 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);
    }</code></pre>

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

<p>实物:</p>

<p></p>
</div>

<p>&nbsp;</p>

nmg 发表于 2022-4-7 09:39

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

lugl4313820 发表于 2022-4-8 09:54

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

serialworld 发表于 2022-6-18 19:55

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

Frieren 发表于 2022-12-15 11:24

<p>可以上传一下工程吗<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/funk1.gif" width="53" /></p>

pomin 发表于 2022-12-15 21:12

Frieren 发表于 2022-12-15 11:24
可以上传一下工程吗

<div></div>

qllaoda 发表于 2023-9-4 13:35

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

jgd0802 发表于 2023-9-17 03:33

<p>怎么接线的看不清图片</p><br/>

jeromeli002 发表于 2023-9-27 19:52

pomin 发表于 2022-12-15 21:12


<p>有编译好可以直接用的固件吗</p>

bobo214 发表于 2023-10-12 10:42

<p>WCH的USB带蓝牙功能不错</p>

张小强吧 发表于 2024-9-10 22:26

<p></p>


<p>万分感谢!键盘成功了,我在研究看看鼠标。哈哈哈</p>
页: [1]
查看完整版本: 【沁恒RISC-V内核 CH582】CH582 有线键盘转蓝牙键盘