CH559操作USB键鼠串口输出,切换大小写指示灯没有任何反应,键盘灯该如何控制,
键盘灯一般是通过SET_REPORT类命令控制传输实现。例如:
(set) 21 09 00 02 00 00 01 00
(out) 01
(in) no data
对接口0下传1字节01实现。具体传输什么值,需要分析HID报表。
USBH_HUB_KM.C这个文件,main的4856行 SETorOFFNumLock(RxBuffer);这个函数是控制点灯的。
具体函数在1672行,如下
*******************************************************************************/
UINT8 SETorOFFNumLock(PUINT8 buf)
{
UINT8 tmp[]= {0x21,0x09,0x00,0x02,0x00,0x00,0x01,0x00};
UINT8 len,s;
if((buf[2]==0x53)&(buf[0]|buf[1]|buf[3]|buf[4]|buf[5]|buf[6]|buf[7]==0))
{
for ( s = 0; s != sizeof( tmp ); s ++ )
{
((PUINT8X)pSetupReq)[ s ] = tmp[s];
}
s = HostCtrlTransfer( TxBuffer, &len ); // 执行控制传输
if ( s != ERR_SUCCESS )
{
return( s );
}
}
return( ERR_SUCCESS );
}
如果点不亮,你看下枚举,可能因为是复合设备,没有调用此函数,另外例子程序测试了部分键鼠,兼容性问题可能会有,操作键鼠流程大致如此,如果操作失败,需要看看具体的监控信息,才好判断问题。
USBH_HUB_KM.C这个文件,main的4856行 SETorOFFNumLock(RxBuffer);这个函数是控制点灯的。
具体函数在1672行,如下
*******************************************************************************/
UINT8 SETorOFFNumLock(PUINT8 buf)
{
UINT8 tmp[]= {0x21,0x09,0x00,0x02,0x00,0x00,0x01,0x00};
UINT8 len,s;
if((buf[2]==0x53)&(buf[0]|buf[1]|buf[3]|buf[4]|buf[5]|buf[6]|buf[7]==0))
{
for ( s = 0; s != sizeof( tmp ); s ++ )
{
((PUINT8X)pSetupReq)[ s ] = tmp[s];
}
s = HostCtrlTransfer( TxBuffer, &len ); // 执行控制传输
if ( s != ERR_SUCCESS )
{
return( s );
}
}
return( ERR_SUCCESS );
}
如果点不亮,你看下枚举,可能因为是复合设备,没有调用此函数,另外例子程序测试了部分键鼠,兼容性问题可能会有,操作键鼠流程大致如此,如果操作失败,需要看看具体的监控信息,才好判断问题。
键盘灯一般是通过SET_REPORT类命令控制传输实现。例如:
(set) 21 09 00 02 00 00 01 00
(out) 01
我现在的系统是ch559从另一个单片机接受out这个控制字,然后发送给键盘。我想了解一下,现在ch559发送完set_report后,是怎么把这个控制字发送出去的
21 09 xx xx是SET_UP包,后面的01是OUT包,区别就在包的属性不同,发送方法都是一样的。再说的直接点就是把USBHostTransact( USB_PID_SETUP << 4 | 0x00, 0x00, 200000/20 )的USB_PID_SETUP换成USB_PID_OUT就行了。
大佬 你的问题解决了吧 我现做的ch559点亮键盘灯 有键盘是正常的 但是有个键盘 直接返回了0x20 请问如何解决呢
这个键盘你可以插电脑,然后看电脑是是怎么点灯的,通过Bushound抓包看一下