Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Mr_Pangza
rt-thread
提交
7628f36f
R
rt-thread
项目概览
Mr_Pangza
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
2
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
7628f36f
编写于
3月 03, 2021
作者:
B
Bernard Xiong
提交者:
GitHub
3月 03, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4376 from LeeChunHei/hid_fix
修復usb host hid和umouse驅動
上级
d718f64d
e03eaec4
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
114 addition
and
72 deletion
+114
-72
components/drivers/Kconfig
components/drivers/Kconfig
+8
-0
components/drivers/usb/usbhost/class/hid.c
components/drivers/usb/usbhost/class/hid.c
+77
-64
components/drivers/usb/usbhost/class/hid.h
components/drivers/usb/usbhost/class/hid.h
+6
-6
components/drivers/usb/usbhost/class/umouse.c
components/drivers/usb/usbhost/class/umouse.c
+23
-2
未找到文件。
components/drivers/Kconfig
浏览文件 @
7628f36f
...
...
@@ -642,6 +642,14 @@ menu "Using USB"
string "Udisk mount dir"
default "/"
endif
config RT_USBH_HID
bool "Enable HID Drivers"
default n
if RT_USBH_HID
config RT_USBH_HID_MOUSE
bool "Enable HID mouse protocol"
default n
endif
endif
config RT_USING_USB_DEVICE
bool "Using USB device"
...
...
components/drivers/usb/usbhost/class/hid.c
浏览文件 @
7628f36f
...
...
@@ -6,6 +6,7 @@
* Change Logs:
* Date Author Notes
* 2011-12-12 Yi Qiu first version
* 2021-02-23 Leslie Lee update with current usb api
*/
#include <rtthread.h>
...
...
@@ -26,7 +27,7 @@ static rt_list_t _protocal_list;
*
* @return the error code, RT_EOK on successfully.
*/
rt_err_t
rt_usbh_hid_set_idle
(
struct
uintf
*
intf
,
int
duration
,
int
report_id
)
rt_err_t
rt_usbh_hid_set_idle
(
struct
u
h
intf
*
intf
,
int
duration
,
int
report_id
)
{
struct
urequest
setup
;
struct
uinstance
*
device
;
...
...
@@ -40,14 +41,15 @@ rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id)
setup
.
request_type
=
USB_REQ_TYPE_DIR_OUT
|
USB_REQ_TYPE_CLASS
|
USB_REQ_TYPE_INTERFACE
;
setup
.
request
=
USB_REQ_SET_IDLE
;
setup
.
index
=
0
;
setup
.
length
=
0
;
setup
.
value
=
(
duration
<<
8
)
|
report_id
;
if
(
rt_usb_hcd_control_xfer
(
device
->
hcd
,
device
,
&
setup
,
RT_NULL
,
0
,
timeout
)
==
0
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
setup
.
bRequest
=
USB_REQ_SET_IDLE
;
setup
.
wIndex
=
0
;
setup
.
wLength
=
0
;
setup
.
wValue
=
(
duration
<<
8
)
|
report_id
;
if
(
rt_usb_hcd_setup_xfer
(
device
->
hcd
,
device
->
pipe_ep0_out
,
&
setup
,
timeout
)
==
8
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
}
/**
...
...
@@ -59,7 +61,7 @@ rt_err_t rt_usbh_hid_set_idle(struct uintf* intf, int duration, int report_id)
*
* @return the error code, RT_EOK on successfully.
*/
rt_err_t
rt_usbh_hid_get_report
(
struct
uintf
*
intf
,
rt_uint8_t
type
,
rt_err_t
rt_usbh_hid_get_report
(
struct
u
h
intf
*
intf
,
rt_uint8_t
type
,
rt_uint8_t
id
,
rt_uint8_t
*
buffer
,
rt_size_t
size
)
{
struct
urequest
setup
;
...
...
@@ -74,14 +76,24 @@ rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
setup
.
request_type
=
USB_REQ_TYPE_DIR_IN
|
USB_REQ_TYPE_CLASS
|
USB_REQ_TYPE_INTERFACE
;
setup
.
request
=
USB_REQ_GET_REPORT
;
setup
.
index
=
intf
->
intf_desc
->
bInterfaceNumber
;
setup
.
length
=
size
;
setup
.
value
=
(
type
<<
8
)
+
id
;
if
(
rt_usb_hcd_control_xfer
(
device
->
hcd
,
device
,
&
setup
,
buffer
,
size
,
timeout
)
==
size
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
setup
.
bRequest
=
USB_REQ_GET_REPORT
;
setup
.
wIndex
=
intf
->
intf_desc
->
bInterfaceNumber
;
setup
.
wLength
=
size
;
setup
.
wValue
=
(
type
<<
8
)
+
id
;
if
(
rt_usb_hcd_setup_xfer
(
device
->
hcd
,
device
->
pipe_ep0_out
,
&
setup
,
timeout
)
==
8
)
{
if
(
rt_usb_hcd_pipe_xfer
(
device
->
hcd
,
device
->
pipe_ep0_in
,
buffer
,
size
,
timeout
)
==
size
)
{
if
(
rt_usb_hcd_pipe_xfer
(
device
->
hcd
,
device
->
pipe_ep0_out
,
RT_NULL
,
0
,
timeout
)
==
0
)
{
return
RT_EOK
;
}
}
}
else
return
-
RT_FALSE
;
return
-
RT_FALSE
;
}
/**
...
...
@@ -93,7 +105,7 @@ rt_err_t rt_usbh_hid_get_report(struct uintf* intf, rt_uint8_t type,
*
* @return the error code, RT_EOK on successfully.
*/
rt_err_t
rt_usbh_hid_set_report
(
struct
uintf
*
intf
,
rt_uint8_t
*
buffer
,
rt_size_t
size
)
rt_err_t
rt_usbh_hid_set_report
(
struct
u
h
intf
*
intf
,
rt_uint8_t
*
buffer
,
rt_size_t
size
)
{
struct
urequest
setup
;
struct
uinstance
*
device
;
...
...
@@ -107,14 +119,15 @@ rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_
setup
.
request_type
=
USB_REQ_TYPE_DIR_OUT
|
USB_REQ_TYPE_CLASS
|
USB_REQ_TYPE_INTERFACE
;
setup
.
request
=
USB_REQ_SET_REPORT
;
setup
.
index
=
intf
->
intf_desc
->
bInterfaceNumber
;
setup
.
length
=
size
;
setup
.
value
=
0x02
<<
8
;
if
(
rt_usb_hcd_control_xfer
(
device
->
hcd
,
device
,
&
setup
,
buffer
,
size
,
timeout
)
==
size
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
setup
.
bRequest
=
USB_REQ_SET_REPORT
;
setup
.
wIndex
=
intf
->
intf_desc
->
bInterfaceNumber
;
setup
.
wLength
=
size
;
setup
.
wValue
=
0x02
<<
8
;
if
(
rt_usb_hcd_setup_xfer
(
device
->
hcd
,
device
->
pipe_ep0_out
,
&
setup
,
timeout
)
==
8
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
}
/**
...
...
@@ -125,7 +138,7 @@ rt_err_t rt_usbh_hid_set_report(struct uintf* intf, rt_uint8_t *buffer, rt_size_
*
* @return the error code, RT_EOK on successfully.
*/
rt_err_t
rt_usbh_hid_set_protocal
(
struct
uintf
*
intf
,
int
protocol
)
rt_err_t
rt_usbh_hid_set_protocal
(
struct
u
h
intf
*
intf
,
int
protocol
)
{
struct
urequest
setup
;
struct
uinstance
*
device
;
...
...
@@ -139,14 +152,15 @@ rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol)
setup
.
request_type
=
USB_REQ_TYPE_DIR_OUT
|
USB_REQ_TYPE_CLASS
|
USB_REQ_TYPE_INTERFACE
;
setup
.
request
=
USB_REQ_SET_PROTOCOL
;
setup
.
index
=
0
;
setup
.
length
=
0
;
setup
.
value
=
protocol
;
if
(
rt_usb_hcd_control_xfer
(
device
->
hcd
,
device
,
&
setup
,
RT_NULL
,
0
,
timeout
)
==
0
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
setup
.
bRequest
=
USB_REQ_SET_PROTOCOL
;
setup
.
wIndex
=
0
;
setup
.
wLength
=
0
;
setup
.
wValue
=
protocol
;
if
(
rt_usb_hcd_setup_xfer
(
device
->
hcd
,
device
->
pipe_ep0_out
,
&
setup
,
timeout
)
==
8
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
}
/**
...
...
@@ -159,7 +173,7 @@ rt_err_t rt_usbh_hid_set_protocal(struct uintf* intf, int protocol)
*
* @return the error code, RT_EOK on successfully.
*/
rt_err_t
rt_usbh_hid_get_report_descriptor
(
struct
uintf
*
intf
,
rt_err_t
rt_usbh_hid_get_report_descriptor
(
struct
u
h
intf
*
intf
,
rt_uint8_t
*
buffer
,
rt_size_t
size
)
{
struct
urequest
setup
;
...
...
@@ -174,14 +188,24 @@ rt_err_t rt_usbh_hid_get_report_descriptor(struct uintf* intf,
setup
.
request_type
=
USB_REQ_TYPE_DIR_IN
|
USB_REQ_TYPE_STANDARD
|
USB_REQ_TYPE_INTERFACE
;
setup
.
request
=
USB_REQ_GET_DESCRIPTOR
;
setup
.
index
=
0
;
setup
.
length
=
size
;
setup
.
value
=
USB_DESC_TYPE_REPORT
<<
8
;
if
(
rt_usb_hcd_control_xfer
(
device
->
hcd
,
device
,
&
setup
,
buffer
,
size
,
timeout
)
==
size
)
return
RT_EOK
;
else
return
-
RT_FALSE
;
setup
.
bRequest
=
USB_REQ_GET_DESCRIPTOR
;
setup
.
wIndex
=
0
;
setup
.
wLength
=
size
;
setup
.
wValue
=
USB_DESC_TYPE_REPORT
<<
8
;
if
(
rt_usb_hcd_setup_xfer
(
device
->
hcd
,
device
->
pipe_ep0_out
,
&
setup
,
timeout
)
==
8
)
{
if
(
rt_usb_hcd_pipe_xfer
(
device
->
hcd
,
device
->
pipe_ep0_in
,
buffer
,
size
,
timeout
)
==
size
)
{
if
(
rt_usb_hcd_pipe_xfer
(
device
->
hcd
,
device
->
pipe_ep0_out
,
RT_NULL
,
0
,
timeout
)
==
0
)
{
return
RT_EOK
;
}
}
}
else
return
-
RT_FALSE
;
return
-
RT_FALSE
;
}
/**
...
...
@@ -220,16 +244,16 @@ static void rt_usbh_hid_callback(void* context)
RT_ASSERT
(
context
!=
RT_NULL
);
pipe
=
(
upipe_t
)
context
;
hid
=
(
struct
uhid
*
)
pipe
->
intf
->
user_data
;
hid
=
(
struct
uhid
*
)
((
struct
uhintf
*
)
pipe
->
inst
)
->
user_data
;
/* invoke protocal callback function */
hid
->
protocal
->
callback
((
void
*
)
hid
);
/* parameter check */
RT_ASSERT
(
pipe
->
intf
->
device
->
hcd
!=
RT_NULL
);
RT_ASSERT
(
((
struct
uhintf
*
)
pipe
->
inst
)
->
device
->
hcd
!=
RT_NULL
);
rt_usb_hcd_
int_xfer
(
pipe
->
intf
->
device
->
hcd
,
pipe
,
hid
->
buffer
,
pipe
->
ep
.
wMaxPacketSize
,
timeout
);
rt_usb_hcd_
pipe_xfer
(((
struct
uhintf
*
)
pipe
->
inst
)
->
device
->
hcd
,
pipe
,
hid
->
buffer
,
pipe
->
ep
.
wMaxPacketSize
,
timeout
);
}
/**
...
...
@@ -268,9 +292,7 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
int
i
=
0
,
pro_id
;
uprotocal_t
protocal
;
struct
uhid
*
hid
;
struct
uintf
*
intf
=
(
struct
uintf
*
)
arg
;
int
timeout
=
USB_TIMEOUT_BASIC
;
upipe_t
pipe
;
struct
uhintf
*
intf
=
(
struct
uhintf
*
)
arg
;
/* parameter check */
if
(
intf
==
RT_NULL
)
...
...
@@ -319,19 +341,13 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
if
(
!
(
ep_desc
->
bEndpointAddress
&
USB_DIR_IN
))
continue
;
ret
=
rt_usb_hcd_alloc_pipe
(
intf
->
device
->
hcd
,
&
hid
->
pipe_in
,
intf
,
ep_desc
,
rt_usbh_hid_callback
);
intf
,
ep_desc
);
if
(
ret
!=
RT_EOK
)
return
ret
;
}
/* initialize hid protocal */
hid
->
protocal
->
init
((
void
*
)
intf
);
pipe
=
hid
->
pipe_in
;
hid
->
protocal
->
init
((
void
*
)
intf
);
/* parameter check */
RT_ASSERT
(
pipe
->
intf
->
device
->
hcd
!=
RT_NULL
);
rt_usb_hcd_int_xfer
(
pipe
->
intf
->
device
->
hcd
,
hid
->
pipe_in
,
hid
->
buffer
,
hid
->
pipe_in
->
ep
.
wMaxPacketSize
,
timeout
);
return
RT_EOK
;
}
...
...
@@ -346,7 +362,7 @@ static rt_err_t rt_usbh_hid_enable(void* arg)
static
rt_err_t
rt_usbh_hid_disable
(
void
*
arg
)
{
struct
uhid
*
hid
;
struct
u
intf
*
intf
=
(
struct
u
intf
*
)
arg
;
struct
u
hintf
*
intf
=
(
struct
uh
intf
*
)
arg
;
RT_ASSERT
(
intf
!=
RT_NULL
);
...
...
@@ -364,9 +380,6 @@ static rt_err_t rt_usbh_hid_disable(void* arg)
/* free the hid instance */
rt_free
(
hid
);
}
/* free the instance */
rt_free
(
intf
);
return
RT_EOK
;
}
...
...
components/drivers/usb/usbhost/class/hid.h
浏览文件 @
7628f36f
...
...
@@ -31,11 +31,11 @@ typedef struct uhid uhid_t;
#define USB_HID_KEYBOARD 1
#define USB_HID_MOUSE 2
rt_err_t
rt_usbh_hid_set_idle
(
struct
uintf
*
intf
,
int
duration
,
int
report_id
);
rt_err_t
rt_usbh_hid_get_report
(
struct
uintf
*
intf
,
rt_uint8_t
type
,
rt_uint8_t
id
,
rt_uint8_t
*
buffer
,
rt_size_t
size
);
rt_err_t
rt_usbh_hid_set_report
(
struct
uintf
*
intf
,
rt_uint8_t
*
buffer
,
rt_size_t
size
);
rt_err_t
rt_usbh_hid_set_protocal
(
struct
uintf
*
intf
,
int
protocol
);
rt_err_t
rt_usbh_hid_get_report_descriptor
(
struct
uintf
*
intf
,
rt_uint8_t
*
buffer
,
rt_size_t
size
);
rt_err_t
rt_usbh_hid_set_idle
(
struct
u
h
intf
*
intf
,
int
duration
,
int
report_id
);
rt_err_t
rt_usbh_hid_get_report
(
struct
u
h
intf
*
intf
,
rt_uint8_t
type
,
rt_uint8_t
id
,
rt_uint8_t
*
buffer
,
rt_size_t
size
);
rt_err_t
rt_usbh_hid_set_report
(
struct
u
h
intf
*
intf
,
rt_uint8_t
*
buffer
,
rt_size_t
size
);
rt_err_t
rt_usbh_hid_set_protocal
(
struct
u
h
intf
*
intf
,
int
protocol
);
rt_err_t
rt_usbh_hid_get_report_descriptor
(
struct
u
h
intf
*
intf
,
rt_uint8_t
*
buffer
,
rt_size_t
size
);
rt_err_t
rt_usbh_hid_protocal_register
(
uprotocal_t
protocal
);
#endif
#endif
\ No newline at end of file
components/drivers/usb/usbhost/class/umouse.c
浏览文件 @
7628f36f
...
...
@@ -126,15 +126,36 @@ static rt_err_t rt_usbh_hid_mouse_callback(void* arg)
return
RT_EOK
;
}
rt_thread_t
mouse_thread
;
void
mouse_task
(
void
*
param
)
{
struct
uhintf
*
intf
=
(
struct
uhintf
*
)
param
;
while
(
1
)
{
if
(
rt_usb_hcd_pipe_xfer
(
intf
->
device
->
hcd
,
((
struct
uhid
*
)
intf
->
user_data
)
->
pipe_in
,
((
struct
uhid
*
)
intf
->
user_data
)
->
buffer
,
((
struct
uhid
*
)
intf
->
user_data
)
->
pipe_in
->
ep
.
wMaxPacketSize
,
USB_TIMEOUT_BASIC
)
==
0
)
{
break
;
}
rt_usbh_hid_mouse_callback
(
intf
->
user_data
);
}
}
static
rt_err_t
rt_usbh_hid_mouse_init
(
void
*
arg
)
{
struct
u
intf
*
intf
=
(
struct
u
intf
*
)
arg
;
struct
u
hintf
*
intf
=
(
struct
uh
intf
*
)
arg
;
RT_ASSERT
(
intf
!=
RT_NULL
);
rt_usbh_hid_set_protocal
(
intf
,
0
);
rt_usbh_hid_set_idle
(
intf
,
10
,
0
);
rt_usbh_hid_set_idle
(
intf
,
0
,
0
);
mouse_thread
=
rt_thread_create
(
"mouse0"
,
mouse_task
,
intf
,
500
,
8
,
100
);
rt_thread_startup
(
mouse_thread
);
RT_DEBUG_LOG
(
RT_DEBUG_USB
,
(
"start usb mouse
\n
"
));
#ifdef RT_USING_RTGUI
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录