Skip to content
This repository was archived by the owner on Feb 28, 2024. It is now read-only.

Commit fcd8a46

Browse files
authored
added USB Host supportO (#47)
1 parent e92cca4 commit fcd8a46

File tree

3 files changed

+199
-1
lines changed

3 files changed

+199
-1
lines changed

examples/USB_host/USB_host.ino

+164
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/*
2+
_______ _ _ _____ ____
3+
|__ __| | | | |/ ____| _ \
4+
| | ___ ___ _ __ _ _| | | | (___ | |_) |
5+
| |/ _ \/ _ \ '_ \| | | | | | |\___ \| _ <
6+
| | __/ __/ | | | |_| | |__| |____) | |_) |
7+
|_|\___|\___|_| |_|\__, |\____/|_____/|____/
8+
__/ |
9+
|___/
10+
11+
TeenyUSB - light weight usb stack for STM32 micro controllers
12+
13+
Copyright (c) 2019 XToolBox - admin@xtoolbox.org
14+
www.tusb.org
15+
16+
Permission is hereby granted, free of charge, to any person obtaining a copy
17+
of this software and associated documentation files (the "Software"), to deal
18+
in the Software without restriction, including without limitation the rights
19+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20+
copies of the Software, and to permit persons to whom the Software is
21+
furnished to do so, subject to the following conditions:
22+
23+
The above copyright notice and this permission notice shall be included in all
24+
copies or substantial portions of the Software.
25+
26+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32+
SOFTWARE.
33+
*/
34+
#include <MachineControl.h>
35+
36+
using namespace machinecontrol;
37+
38+
REDIRECT_STDOUT_TO(Serial);
39+
40+
static int process_key(tusbh_ep_info_t* ep, const uint8_t* key);
41+
42+
static const tusbh_boot_key_class_t cls_boot_key = {
43+
.backend = &tusbh_boot_keyboard_backend,
44+
//.on_key = process_key
45+
};
46+
47+
static const tusbh_boot_mouse_class_t cls_boot_mouse = {
48+
.backend = &tusbh_boot_mouse_backend,
49+
// .on_mouse = process_mouse
50+
};
51+
52+
static const tusbh_hid_class_t cls_hid = {
53+
.backend = &tusbh_hid_backend,
54+
//.on_recv_data = process_hid_recv,
55+
//.on_send_done = process_hid_sent,
56+
};
57+
58+
static const tusbh_hub_class_t cls_hub = {
59+
.backend = &tusbh_hub_backend,
60+
};
61+
62+
static const tusbh_vendor_class_t cls_vendor = {
63+
.backend = &tusbh_vendor_backend,
64+
//.transfer_done = process_vendor_xfer_done
65+
};
66+
67+
int msc_ff_mount(tusbh_interface_t* interface, int max_lun, const tusbh_block_info_t* blocks);
68+
int msc_ff_unmount(tusbh_interface_t* interface);
69+
70+
static const tusbh_msc_class_t cls_msc_bot = {
71+
.backend = &tusbh_msc_bot_backend,
72+
// .mount = msc_ff_mount,
73+
// .unmount = msc_ff_unmount,
74+
};
75+
76+
static const tusbh_cdc_acm_class_t cls_cdc_acm = {
77+
.backend = &tusbh_cdc_acm_backend,
78+
};
79+
80+
static const tusbh_cdc_rndis_class_t cls_cdc_rndis = {
81+
.backend = &tusbh_cdc_rndis_backend,
82+
};
83+
84+
static const tusbh_class_reg_t class_table[] = {
85+
(tusbh_class_reg_t)&cls_boot_key,
86+
(tusbh_class_reg_t)&cls_boot_mouse,
87+
(tusbh_class_reg_t)&cls_hub,
88+
(tusbh_class_reg_t)&cls_msc_bot,
89+
(tusbh_class_reg_t)&cls_cdc_acm,
90+
(tusbh_class_reg_t)&cls_cdc_rndis,
91+
(tusbh_class_reg_t)&cls_hid,
92+
(tusbh_class_reg_t)&cls_vendor,
93+
0,
94+
};
95+
96+
97+
void setup()
98+
{
99+
Serial1.begin(115200);
100+
usb_controller.init(class_table);
101+
102+
}
103+
104+
void loop() {
105+
usb_controller.usb.Task();
106+
}
107+
108+
#define MOD_CTRL (0x01 | 0x10)
109+
#define MOD_SHIFT (0x02 | 0x20)
110+
#define MOD_ALT (0x04 | 0x40)
111+
#define MOD_WIN (0x08 | 0x80)
112+
113+
#define LED_NUM_LOCK 1
114+
#define LED_CAPS_LOCK 2
115+
#define LED_SCROLL_LOCK 4
116+
117+
#define stdin_recvchar Serial1.write
118+
119+
static uint8_t key_leds;
120+
static const char knum[] = "1234567890";
121+
static const char ksign[] = "!@#$%^&*()";
122+
static const char tabA[] = "\t -=[]\\#;'`,./";
123+
static const char tabB[] = "\t _+{}|~:\"~<>?";
124+
// route the key event to stdin
125+
static int process_key(tusbh_ep_info_t* ep, const uint8_t* keys)
126+
{
127+
printf("\n");
128+
uint8_t modify = keys[0];
129+
uint8_t key = keys[2];
130+
uint8_t last_leds = key_leds;
131+
if (key >= KEY_A && key <= KEY_Z) {
132+
char ch = 'A' + key - KEY_A;
133+
if ( (!!(modify & MOD_SHIFT)) == (!!(key_leds & LED_CAPS_LOCK)) ) {
134+
ch += 'a' - 'A';
135+
}
136+
stdin_recvchar(ch);
137+
Serial.print(ch);
138+
} else if (key >= KEY_1 && key <= KEY_0) {
139+
if (modify & MOD_SHIFT) {
140+
stdin_recvchar(ksign[key - KEY_1]);
141+
} else {
142+
stdin_recvchar(knum[key - KEY_1]);
143+
}
144+
} else if (key >= KEY_TAB && key <= KEY_SLASH) {
145+
if (modify & MOD_SHIFT) {
146+
stdin_recvchar(tabB[key - KEY_TAB]);
147+
} else {
148+
stdin_recvchar(tabA[key - KEY_TAB]);
149+
}
150+
} else if (key == KEY_ENTER) {
151+
stdin_recvchar('\r');
152+
} else if (key == KEY_CAPSLOCK) {
153+
key_leds ^= LED_CAPS_LOCK;
154+
} else if (key == KEY_NUMLOCK) {
155+
key_leds ^= LED_NUM_LOCK;
156+
} else if (key == KEY_SCROLLLOCK) {
157+
key_leds ^= LED_SCROLL_LOCK;
158+
}
159+
160+
if (key_leds != last_leds) {
161+
tusbh_set_keyboard_led(ep, key_leds);
162+
}
163+
return 0;
164+
}

src/MachineControl.h

+34-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
#include "utility/QEI/QEI.h"
88
#include "utility/ioexpander/ArduinoIOExpander.h"
99
#include "utility/RTC/PCF8563T.h"
10+
#include "utility/RTC/PCF8563T.h"
1011

1112
#include "Arduino.h"
1213
#include "mbed.h"
1314

15+
#include "USBHost.h"
16+
1417
namespace machinecontrol {
1518

1619
class RTDClass {
@@ -484,6 +487,36 @@ class RtcControllerClass : public PCF8563TClass {
484487

485488
extern RtcControllerClass rtc_controller;
486489

487-
}
488490

491+
492+
class USBClass {
493+
public:
494+
void init(const tusbh_class_reg_t *class_table) {
495+
usb.Init(USB_CORE_ID_FS, class_table);
496+
}
497+
498+
void powerEnable() {
499+
power = 0;
500+
}
501+
502+
void powerDisable() {
503+
power = 1;
504+
}
505+
506+
bool vflagRead() {
507+
return usbflag;
508+
}
509+
510+
USBHost usb;
511+
512+
private:
513+
mbed::DigitalOut power = mbed::DigitalOut(PB_14);
514+
mbed::DigitalIn usbflag = mbed::DigitalIn(PB_15);
515+
};
516+
517+
518+
extern USBClass usb_controller;
519+
520+
521+
}
489522
#endif

src/Objects.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ DigitalOutputsClass digital_outputs;
1111
ProgrammableDINClass digital_inputs;
1212
ProgrammableDIOClass digital_programmables;
1313
RtcControllerClass rtc_controller;
14+
USBClass usb_controller;
1415
}

0 commit comments

Comments
 (0)