Browse Source

add:soft keyboard的lua接口,自定义HID的report和upload方式

alienwalker 4 years ago
parent
commit
cedaed2976

+ 1 - 0
application/include/app_interface.h

@@ -42,6 +42,7 @@
 #include "core_dcmi.h"
 #include "core_rng.h"
 #include "core_task.h"
+#include "core_soft_keyboard.h"
 #include "lfs.h"
 #include "usb_driver.h"
 #include "usb_hid.h"

+ 2 - 0
application/include/luat_conf_bsp.h

@@ -62,6 +62,8 @@
 #define LUAT_USE_CAMERA  1
 #define LUAT_USE_FATFS 1
 
+#define LUAT_USE_SOFTKB 1
+
 //----------------------------
 // 高通字体, 需配合芯片使用
 // #define LUAT_USE_GTFONT 1

+ 3 - 1
application/src/luat_base_air105.c

@@ -41,7 +41,6 @@ void lv_png_init(void);
 void lv_split_jpeg_init(void);
 #endif
 
-LUAMOD_API int luaopen_gtfont( lua_State *L );
 LUAMOD_API int luaopen_usbapp( lua_State *L );
 
 static const luaL_Reg loadedlibs[] = {
@@ -196,6 +195,9 @@ static const luaL_Reg loadedlibs[] = {
 #endif 
 #ifdef LUAT_USE_NES   
   {"nes", luaopen_nes}, 
+#endif
+#ifdef LUAT_USE_SOFTKB
+  {"softkb", luaopen_softkb}, 
 #endif
   {"usbapp", luaopen_usbapp},
   {NULL, NULL}

+ 52 - 0
application/src/luat_softkeyboard_air105.c

@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2022 OpenLuat & AirM2M
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "luat_base.h"
+#include "luat_softkeyboard.h"
+#include "luat_malloc.h"
+#include "luat_msgbus.h"
+
+#include "app_interface.h"
+
+#define LUAT_LOG_TAG "soft_keyboard"
+#include "luat_log.h"
+
+static void l_softkeyboard_irq_cb(void *pData, void *pParam) {
+    rtos_msg_t msg = {0};
+    msg.handler = l_softkeyboard_handler;
+    msg.arg1 = 0;
+    msg.arg2 = (uint16_t) pData;
+    msg.ptr = (((uint32_t)pData) >> 16) & 0x1;
+    luat_msgbus_put(&msg, 0);
+}
+
+int luat_softkeyboard_init(luat_softkeyboard_conf_t *conf){
+	SoftKB_Setup(6250, 4, 2, 0, l_softkeyboard_irq_cb, NULL);
+	SoftKB_IOConfig(conf->inio, conf->inio_num, conf->outio, conf->outio_num, 0);
+    SoftKB_Start();
+    return 0;
+}
+
+int luat_softkeyboard_deinit(luat_softkeyboard_conf_t *conf){
+    SoftKB_Stop();
+    return 0;
+}
+

+ 25 - 0
bsp/air105/test/test_usb_device.c

@@ -50,9 +50,34 @@ static int32_t prvTest_USBCB(void *pData, void *pParam)
 	}
 }
 
+int32_t prvTest_HIDCB(void *pData, void *pParam)
+{
+	Buffer_Struct *Buf;
+	switch((uint32_t)pParam)
+	{
+	case USB_HID_NOT_READY:
+		DBG("hid disconnected");
+		break;
+	case USB_HID_READY:
+		DBG("hid connected");
+		break;
+	case USB_HID_SEND_DONE:
+		DBG("hid send ok");
+		break;
+	default:
+		Buf = (Buffer_Struct *)pParam;
+		DBG("hid get data:");
+		DBG_HexPrintf(Buf->Data, Buf->Pos);
+		Core_VHIDSendRawData(0, "just Test Once!\n", 16);
+		break;
+	}
+    return 0;
+}
+
 void Test_USBStart(void)
 {
 	Core_VUartInit(VIRTUAL_UART0, 0, 1, 0, 0, 0, prvTest_USBCB);
+	Core_VHIDInit(0, prvTest_HIDCB);
 //	Core_VUartSetRxTimeout(VIRTUAL_UART0, 200);
 }
 

+ 51 - 5
bsp/common/src/core_usb_app.c

@@ -86,6 +86,8 @@ typedef struct
 	DBuffer_Struct DataBuf;
 	SDHC_SPICtrlStruct *pSDHC;
 	HANDLE hTaskHandle;
+	uint8_t *pHIDReport;
+	uint16_t HIDReportLen;
 }USB_AppCtrlStruct;
 
 static const uint8_t prvCore_StandardInquiryData[STANDARD_INQUIRY_DATA_LEN] =
@@ -309,7 +311,7 @@ static const usb_interface_descriptor_t prvCore_HIDInterfaceDesc =
 		.bNumEndpoints = 2,
 		.bInterfaceClass = UICLASS_HID,
 		.bInterfaceSubClass = 0,
-		.bInterfaceProtocol = UIPROTO_BOOT_KEYBOARD,
+		.bInterfaceProtocol = 0,
 		.iInterface = USBD_IDX_INTERFACE0_STR + 1,
 };
 
@@ -377,7 +379,26 @@ static const usb_hid_descriptor_t  prvCore_HIDDesc =
 		.wDescriptorLength = {63,0},
 };
 
-static const char prvCore_HIDReportDesc[63] = {
+static const char prvCore_HIDCustomReportDescriptor[34] = {
+	    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
+	    0x09, 0x00,                    // USAGE (Undefined)
+	    0xa1, 0x01,                    // COLLECTION (Application)
+	    0x09, 0x00,                    //   USAGE (Undefined)
+	    0x75, 0x08,                    //   REPORT_SIZE (8)
+	    0x95, 0x08,                    //   REPORT_COUNT (8)
+	    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
+	    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
+	    0x81, 0x02,                    // INPUT (Data,Var,Abs)
+	    0x09, 0x00,                    //   USAGE (Undefined)
+	    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
+	    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
+	    0x95, 0x08,                    //   REPORT_COUNT (8)
+	    0x75, 0x08,                    //   REPORT_SIZE (8)
+	    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
+	    0xc0                           // END_COLLECTION
+};
+
+static const char prvCore_HIDKeyboardReportDesc[64] = {
 	    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
 	    0x09, 0x06,                    // USAGE (Keyboard)
 	    0xa1, 0x01,                    // COLLECTION (Application)
@@ -404,7 +425,7 @@ static const char prvCore_HIDReportDesc[63] = {
 	    0x95, 0x06,                    //   REPORT_COUNT (6)
 	    0x75, 0x08,                    //   REPORT_SIZE (8)
 	    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
-	    0x25, 0xff,                    //   LOGICAL_MAXIMUM (255)
+	    0x26, 0x00, 0xff,             	  //   LOGICAL_MAXIMUM (255)
 	    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
 	    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))
 	    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)
@@ -414,9 +435,12 @@ static const char prvCore_HIDReportDesc[63] = {
 
 static int32_t prvCore_GetHIDDesc(void *pData, void *pParam)
 {
+	usb_hid_descriptor_t HIDDesc;
 	if (pData)
 	{
-		memcpy(pData, &prvCore_HIDDesc, sizeof(usb_hid_descriptor_t));
+		HIDDesc = prvCore_HIDDesc;
+		BytesPutLe16(HIDDesc.wDescriptorLength, prvUSBApp.HIDReportLen);
+		memcpy(pData, &HIDDesc, sizeof(usb_hid_descriptor_t));
 	}
 	return sizeof(usb_hid_descriptor_t);
 }
@@ -655,7 +679,7 @@ static int32_t prvCore_USBEp0CB(void *pData, void *pParam)
 				switch(pEpData->pLastRequest->wValue[1])
 				{
 				case USB_HID_REPORT_DESC:
-					USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, prvCore_HIDReportDesc, sizeof(prvCore_HIDReportDesc), wLength, 1);
+					USB_StackTxEpData(pEpData->USB_ID, pEpData->EpIndex, prvUSBApp.pHIDReport, prvUSBApp.HIDReportLen, wLength, 1);
 					Result = ERROR_NONE;
 					break;
 				}
@@ -725,9 +749,13 @@ static int32_t prvCore_HIDCB(void *pData, void *pParam)
 	USB_EndpointDataStruct *pEpData = (USB_EndpointDataStruct *)pData;
 	uint32_t USB_ID = (uint32_t)pParam;
 	Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
+	Buffer_Struct Buf;
 	if (pEpData->IsToDevice)
 	{
 		prvCore_VHIDSetReady(1);
+		Buf.Data = pEpData->Data;
+		Buf.Pos = pEpData->Len;
+		pVHID->CB(prvLuatOS_VirtualHID.USB_ID, &Buf);
 	}
 	else
 	{
@@ -827,6 +855,11 @@ void Core_USBDefaultDeviceStart(uint8_t USB_ID)
 	prvUSBApp.tSCSI.LogicalUnitNum = 0;
 	prvUSBApp.tSCSI.ToHostEpIndex = DEVICE_MASS_STORAGE_EP_IN;
 	prvUSBApp.tSCSI.ToDeviceEpIndex = DEVICE_MASS_STORAGE_EP_OUT;
+	if (!prvUSBApp.pHIDReport)
+	{
+		prvUSBApp.pHIDReport = &prvCore_HIDKeyboardReportDesc;
+		prvUSBApp.HIDReportLen = sizeof(prvCore_HIDKeyboardReportDesc);
+	}
 	if (!prvUSBApp.tSCSI.pSCSIUserFunList)
 	{
 		prvUSBApp.tSCSI.pSCSIUserFunList = &prvCore_SCSIFun;
@@ -1144,6 +1177,19 @@ UPLOAD_END:
 	USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
 }
 
+void Core_VHIDSendRawData(uint8_t USB_ID, uint8_t *Data, uint16_t Len)
+{
+	if (!prvLuatOS_VirtualHID.IsReady) return;
+	USB_HIDKeyValue HIDKey;
+	Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;
+	USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 0);
+	OS_BufferWrite(&pVHID->TxCacheBuf, Data, Len);
+	Buffer_StaticInit(&pVHID->TxBuf, pVHID->TxCacheBuf.Data, pVHID->TxCacheBuf.Pos);
+	OS_InitBuffer(&pVHID->TxCacheBuf, VIRTUAL_VHID_BUFFER_LEN);
+	USB_StackTxEpData(pVHID->USB_ID, pVHID->ToHostEpIndex, pVHID->TxBuf.Data, pVHID->TxBuf.MaxLen, pVHID->TxBuf.MaxLen, 1);
+	USB_StackEpIntOnOff(pVHID->USB_ID, pVHID->ToHostEpIndex, 0, 1);
+}
+
 void Core_VHIDUploadStop(uint8_t USB_ID)
 {
 	Virtual_HIDCtrlStruct *pVHID = &prvLuatOS_VirtualHID;

+ 1 - 1
bsp/usb/include/usb_hid.h

@@ -215,7 +215,7 @@ typedef struct
 		struct
 		{
 			uint8_t NumsLock:1;
-			uint8_t l1  :1;
+			uint8_t CapsLock:1;
 			uint8_t l2:1;
 			uint8_t l3:1;
 			uint8_t Kana:1;

+ 1 - 1
bsp/usb/src/core_usb_class_msc_scsi.c

@@ -254,7 +254,7 @@ static void prvUSB_SCSIHandleCmd(USB_EndpointDataStruct *pEpData, MSC_SCSICtrlSt
 CMD_PROC_END:
 	if (Result)
 	{
-		DBG("%02x", pMSC->CBW.CB[0]);
+		//DBG("%02x", pMSC->CBW.CB[0]);
 		if (!pMSC->Sense.Skey)
 		{
 			USB_SCSISetSenseState(pMSC, SENSE_KEY_ILLEGAL_REQUEST, INVALID_COMMAND_OPERATION_CODE, 0, NULL);

+ 2 - 0
xmake.lua

@@ -316,6 +316,8 @@ if with_luatos then
 
     add_files(luatos.."components/camera/*.c")
     add_includedirs(luatos.."components/camera")
+    add_files(luatos.."components/soft_keyboard/*.c")
+    add_includedirs(luatos.."components/soft_keyboard")
 else
 
     add_files("Third_Party/vsprintf/*.c",{public = true})