TEAMUSB_SLAVE

Dependencies:   USBHost mbed

Fork of USBHostKeyboard_HelloWorld by TEAMUSB

Committer:
armdran
Date:
Tue Apr 07 15:33:25 2015 +0000
Revision:
11:e12aae7de530
Parent:
10:54ffd94e075c
Child:
12:d32975c44c98
spi reboot (should work with reboot_spi_master)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 0:88d52e197201 1 #include "mbed.h"
samux 0:88d52e197201 2 #include "USBHostKeyboard.h"
wlangenkamp 7:be82ac3c4821 3 #include "rtos.h"
samux 0:88d52e197201 4
samux 0:88d52e197201 5 DigitalOut led(LED1);
armdran 9:8bcd70b26084 6 SPISlave device(D11, D12, D13, D10);
armdran 11:e12aae7de530 7 DigitalOut ir(D9);
armdran 11:e12aae7de530 8
armdran 11:e12aae7de530 9 uint8_t spi_reply_blocking(uint8_t reply = 0x00, bool sendIr = 0) {
armdran 11:e12aae7de530 10 device.reply(reply);
armdran 11:e12aae7de530 11 if(sendIr == 1) { wait_ms(100); ir = 1; ir = 0;}
armdran 11:e12aae7de530 12 while(!device.receive()) {}
armdran 11:e12aae7de530 13 uint8_t instruction = device.read();
armdran 11:e12aae7de530 14 //printf(" send: %x received: %x\r\n", reply, instruction);
armdran 11:e12aae7de530 15 return instruction;
armdran 11:e12aae7de530 16 }
armdran 11:e12aae7de530 17
samux 0:88d52e197201 18
armdran 8:f8122ca2f58f 19 void onKeyMod(uint8_t key, uint8_t modifier) {
armdran 11:e12aae7de530 20 printf("got key: %x modifier: %x.\r\n", key, modifier);
armdran 11:e12aae7de530 21
armdran 11:e12aae7de530 22 uint8_t instruction = spi_reply_blocking(key, 1);
armdran 11:e12aae7de530 23 while(instruction != 0xFE) {
armdran 11:e12aae7de530 24 printf(" out of sync.\r\n");
armdran 11:e12aae7de530 25 //instruction = spi_reply_blocking(key, 1);
armdran 11:e12aae7de530 26 return;
armdran 11:e12aae7de530 27 }
armdran 11:e12aae7de530 28
armdran 11:e12aae7de530 29 //printf(" got instruction FE. key sent\r\n");
armdran 11:e12aae7de530 30 uint8_t ack_key = spi_reply_blocking(modifier);
armdran 11:e12aae7de530 31 if(ack_key != key)
armdran 11:e12aae7de530 32 printf(" key ack failed (is %x, should be %x)!!!\r\n", ack_key, key);
armdran 11:e12aae7de530 33 else
armdran 11:e12aae7de530 34 printf(" key ack ok\r\n");
armdran 11:e12aae7de530 35
armdran 11:e12aae7de530 36 //printf(" mod sent.\r\n");
armdran 11:e12aae7de530 37 uint8_t ack_modifier = spi_reply_blocking();
armdran 11:e12aae7de530 38 if(ack_modifier != modifier)
armdran 11:e12aae7de530 39 printf(" mod ack failed(is %x, should be %x)!!!\r\n", ack_modifier, modifier);
armdran 11:e12aae7de530 40 else
armdran 11:e12aae7de530 41 printf(" mod ack ok\r\n");
armdran 11:e12aae7de530 42
armdran 8:f8122ca2f58f 43 }
armdran 8:f8122ca2f58f 44
armdran 8:f8122ca2f58f 45
samux 0:88d52e197201 46 void keyboard_task(void const *) {
samux 0:88d52e197201 47
samux 0:88d52e197201 48 USBHostKeyboard keyboard;
samux 0:88d52e197201 49
samux 0:88d52e197201 50 while(1) {
armdran 8:f8122ca2f58f 51
armdran 8:f8122ca2f58f 52 printf("trying to connect\r\n");
armdran 8:f8122ca2f58f 53
samux 0:88d52e197201 54 // try to connect a USB keyboard
armdran 8:f8122ca2f58f 55 while(!keyboard.connect()) {
samux 0:88d52e197201 56 Thread::wait(500);
armdran 8:f8122ca2f58f 57 }
armdran 8:f8122ca2f58f 58
armdran 8:f8122ca2f58f 59 printf("connected\r\n");
armdran 8:f8122ca2f58f 60
samux 0:88d52e197201 61 // when connected, attach handler called on keyboard event
armdran 8:f8122ca2f58f 62 keyboard.attach(onKeyMod);
armdran 8:f8122ca2f58f 63
armdran 8:f8122ca2f58f 64 printf("eventhandler attached\r\n");
samux 0:88d52e197201 65
samux 0:88d52e197201 66 // wait until the keyboard is disconnected
armdran 8:f8122ca2f58f 67 while(keyboard.connected()) {
armdran 8:f8122ca2f58f 68 USBHost::poll();
armdran 8:f8122ca2f58f 69 }
armdran 8:f8122ca2f58f 70
armdran 8:f8122ca2f58f 71 printf("disconnected\r\n");
armdran 8:f8122ca2f58f 72
samux 0:88d52e197201 73 }
samux 0:88d52e197201 74 }
samux 0:88d52e197201 75
samux 0:88d52e197201 76 int main() {
samux 0:88d52e197201 77 Thread keyboardTask(keyboard_task, NULL, osPriorityNormal, 256 * 4);
armdran 9:8bcd70b26084 78 device.frequency(1000000);
armdran 11:e12aae7de530 79 device.format(8, 1);
armdran 11:e12aae7de530 80 while(1) {}
armdran 9:8bcd70b26084 81
samux 0:88d52e197201 82 }