kopia lustrzana https://github.com/conorpp/u2f-zero
cleaned up some
rodzic
f5334701d7
commit
68e1d59e12
|
@ -153,7 +153,7 @@
|
|||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="com.silabs.ide.project.core" project.generation="57" projectCommon.buildArtifactType="EXE" projectCommon.kitId="com.silabs.kit.si8051.efm8ub1_slstk2000a" projectCommon.partId="com.silabs.mcu.si8051.efm8ub1_g.efm8ub10f16g" projectCommon.sdkId="com.silabs.sdk.si8051.sls:3.0.0"/>
|
||||
<storageModule moduleId="com.silabs.ide.project.core" project.generation="98" projectCommon.buildArtifactType="EXE" projectCommon.kitId="com.silabs.kit.si8051.efm8ub1_slstk2000a" projectCommon.partId="com.silabs.mcu.si8051.efm8ub1_g.efm8ub10f16g" projectCommon.sdkId="com.silabs.sdk.si8051.sls:3.0.0"/>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="u2f-firmware.com.silabs.ide.project.core.cdt.cdtMbsProjectType.801504117" name="SLS CDT Project" projectType="com.silabs.ide.project.core.cdt.cdtMbsProjectType"/>
|
||||
</storageModule>
|
||||
|
|
|
@ -23,6 +23,7 @@ extern void PBCFG_0_enter_DefaultMode_from_RESET(void);
|
|||
extern void CIP51_0_enter_DefaultMode_from_RESET(void);
|
||||
extern void CLOCK_0_enter_DefaultMode_from_RESET(void);
|
||||
extern void TIMER01_0_enter_DefaultMode_from_RESET(void);
|
||||
extern void TIMER16_2_enter_DefaultMode_from_RESET(void);
|
||||
extern void TIMER_SETUP_0_enter_DefaultMode_from_RESET(void);
|
||||
extern void UART_0_enter_DefaultMode_from_RESET(void);
|
||||
extern void INTERRUPT_0_enter_DefaultMode_from_RESET(void);
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
* app.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef APP_H_
|
||||
#define APP_H_
|
||||
|
||||
struct APP_DATA
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
#endif /* APP_H_ */
|
|
@ -8,10 +8,39 @@
|
|||
#ifndef BSP_H_
|
||||
#define BSP_H_
|
||||
|
||||
#include <SI_EFM8UB1_Register_Enums.h>
|
||||
#include <efm8_usb.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EP_BUSY = 0,
|
||||
EP_FREE,
|
||||
}
|
||||
ENDPOINT_STATE;
|
||||
|
||||
|
||||
struct APP_DATA
|
||||
{
|
||||
ENDPOINT_STATE EP1_state;
|
||||
uint8_t hidmsgbuf[64];
|
||||
|
||||
// ms
|
||||
uint16_t usb_read_timeout;
|
||||
};
|
||||
|
||||
|
||||
SI_SBIT(LED_R, SFR_P0, 6);
|
||||
SI_SBIT(LED_G, SFR_P0, 5);
|
||||
SI_SBIT(LED_B, SFR_P0, 4);
|
||||
|
||||
void Delay(int16_t ms);
|
||||
|
||||
extern uint16_t _MS_;
|
||||
|
||||
#define get_ms() _MS_
|
||||
|
||||
extern SI_SEGMENT_VARIABLE(myUsbDevice, USBD_Device_TypeDef, MEM_MODEL_SEG);
|
||||
|
||||
#define GetEp(epAddr) (&myUsbDevice.ep0 + epAddr)
|
||||
|
||||
#endif /* BSP_H_ */
|
||||
|
|
|
@ -33,6 +33,7 @@ extern void enter_DefaultMode_from_RESET(void) {
|
|||
CIP51_0_enter_DefaultMode_from_RESET();
|
||||
CLOCK_0_enter_DefaultMode_from_RESET();
|
||||
TIMER01_0_enter_DefaultMode_from_RESET();
|
||||
TIMER16_2_enter_DefaultMode_from_RESET();
|
||||
TIMER_SETUP_0_enter_DefaultMode_from_RESET();
|
||||
UART_0_enter_DefaultMode_from_RESET();
|
||||
INTERRUPT_0_enter_DefaultMode_from_RESET();
|
||||
|
@ -368,6 +369,58 @@ extern void TIMER01_0_enter_DefaultMode_from_RESET(void) {
|
|||
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
// TIMER16_2_enter_DefaultMode_from_RESET
|
||||
//================================================================================
|
||||
extern void TIMER16_2_enter_DefaultMode_from_RESET(void) {
|
||||
// $[Timer Initialization]
|
||||
// Save Timer Configuration
|
||||
uint8_t TMR2CN0_TR2_save;
|
||||
TMR2CN0_TR2_save = TMR2CN0 & TMR2CN0_TR2__BMASK;
|
||||
// Stop Timer
|
||||
TMR2CN0 &= ~(TMR2CN0_TR2__BMASK);
|
||||
// [Timer Initialization]$
|
||||
|
||||
// $[TMR2CN1 - Timer 2 Control 1]
|
||||
// [TMR2CN1 - Timer 2 Control 1]$
|
||||
|
||||
// $[TMR2CN0 - Timer 2 Control]
|
||||
// [TMR2CN0 - Timer 2 Control]$
|
||||
|
||||
// $[TMR2H - Timer 2 High Byte]
|
||||
// [TMR2H - Timer 2 High Byte]$
|
||||
|
||||
// $[TMR2L - Timer 2 Low Byte]
|
||||
// [TMR2L - Timer 2 Low Byte]$
|
||||
|
||||
// $[TMR2RLH - Timer 2 Reload High Byte]
|
||||
/*
|
||||
// TMR2RLH (Timer 2 Reload High Byte) = 0x44
|
||||
*/
|
||||
TMR2RLH = (0x44 << TMR2RLH_TMR2RLH__SHIFT);
|
||||
// [TMR2RLH - Timer 2 Reload High Byte]$
|
||||
|
||||
// $[TMR2RLL - Timer 2 Reload Low Byte]
|
||||
/*
|
||||
// TMR2RLL (Timer 2 Reload Low Byte) = 0x80
|
||||
*/
|
||||
TMR2RLL = (0x80 << TMR2RLL_TMR2RLL__SHIFT);
|
||||
// [TMR2RLL - Timer 2 Reload Low Byte]$
|
||||
|
||||
// $[TMR2CN0]
|
||||
/*
|
||||
// TR2 (Timer 2 Run Control) = RUN (Start Timer 2 running.)
|
||||
*/
|
||||
TMR2CN0 |= TMR2CN0_TR2__RUN;
|
||||
// [TMR2CN0]$
|
||||
|
||||
// $[Timer Restoration]
|
||||
// Restore Timer Configuration
|
||||
TMR2CN0 |= TMR2CN0_TR2_save;
|
||||
// [Timer Restoration]$
|
||||
|
||||
}
|
||||
|
||||
//================================================================================
|
||||
// TIMER_SETUP_0_enter_DefaultMode_from_RESET
|
||||
//================================================================================
|
||||
|
@ -379,8 +432,8 @@ extern void TIMER_SETUP_0_enter_DefaultMode_from_RESET(void) {
|
|||
// defined by the prescale field, SCA.)
|
||||
// T2MH (Timer 2 High Byte Clock Select) = EXTERNAL_CLOCK (Timer 2 high
|
||||
// byte uses the clock defined by T2XCLK in TMR2CN0.)
|
||||
// T2ML (Timer 2 Low Byte Clock Select) = EXTERNAL_CLOCK (Timer 2 low
|
||||
// byte uses the clock defined by T2XCLK in TMR2CN0.)
|
||||
// T2ML (Timer 2 Low Byte Clock Select) = SYSCLK (Timer 2 low byte uses
|
||||
// the system clock.)
|
||||
// T3MH (Timer 3 High Byte Clock Select) = EXTERNAL_CLOCK (Timer 3 high
|
||||
// byte uses the clock defined by T3XCLK in TMR3CN0.)
|
||||
// T3ML (Timer 3 Low Byte Clock Select) = EXTERNAL_CLOCK (Timer 3 low
|
||||
|
@ -388,7 +441,7 @@ extern void TIMER_SETUP_0_enter_DefaultMode_from_RESET(void) {
|
|||
// T1M (Timer 1 Clock Select) = SYSCLK (Timer 1 uses the system clock.)
|
||||
*/
|
||||
CKCON0 = CKCON0_SCA__SYSCLK_DIV_12 | CKCON0_T0M__PRESCALE
|
||||
| CKCON0_T2MH__EXTERNAL_CLOCK | CKCON0_T2ML__EXTERNAL_CLOCK
|
||||
| CKCON0_T2MH__EXTERNAL_CLOCK | CKCON0_T2ML__SYSCLK
|
||||
| CKCON0_T3MH__EXTERNAL_CLOCK | CKCON0_T3ML__EXTERNAL_CLOCK
|
||||
| CKCON0_T1M__SYSCLK;
|
||||
// [CKCON0 - Clock Control 0]$
|
||||
|
@ -441,27 +494,6 @@ extern void UART_0_enter_DefaultMode_from_RESET(void) {
|
|||
//================================================================================
|
||||
extern void INTERRUPT_0_enter_DefaultMode_from_RESET(void) {
|
||||
// $[EIE1 - Extended Interrupt Enable 1]
|
||||
/*
|
||||
// EADC0 (ADC0 Conversion Complete Interrupt Enable) = DISABLED (Disable
|
||||
// ADC0 Conversion Complete interrupt.)
|
||||
// EWADC0 (ADC0 Window Comparison Interrupt Enable) = DISABLED (Disable
|
||||
// ADC0 Window Comparison interrupt.)
|
||||
// ECP0 (Comparator0 (CP0) Interrupt Enable) = DISABLED (Disable CP0
|
||||
// interrupts.)
|
||||
// ECP1 (Comparator1 (CP1) Interrupt Enable) = DISABLED (Disable CP1
|
||||
// interrupts.)
|
||||
// EMAT (Port Match Interrupts Enable) = ENABLED (Enable interrupt
|
||||
// requests generated by a Port Match.)
|
||||
// EPCA0 (Programmable Counter Array (PCA0) Interrupt Enable) = DISABLED
|
||||
// (Disable all PCA0 interrupts.)
|
||||
// ESMB0 (SMBus (SMB0) Interrupt Enable) = DISABLED (Disable all SMB0
|
||||
// interrupts.)
|
||||
// ET3 (Timer 3 Interrupt Enable) = DISABLED (Disable Timer 3
|
||||
// interrupts.)
|
||||
*/
|
||||
EIE1 = EIE1_EADC0__DISABLED | EIE1_EWADC0__DISABLED | EIE1_ECP0__DISABLED
|
||||
| EIE1_ECP1__DISABLED | EIE1_EMAT__ENABLED | EIE1_EPCA0__DISABLED
|
||||
| EIE1_ESMB0__DISABLED | EIE1_ET3__DISABLED;
|
||||
// [EIE1 - Extended Interrupt Enable 1]$
|
||||
|
||||
// $[EIE2 - Extended Interrupt Enable 2]
|
||||
|
@ -493,12 +525,13 @@ extern void INTERRUPT_0_enter_DefaultMode_from_RESET(void) {
|
|||
// interrupt.)
|
||||
// ET1 (Timer 1 Interrupt Enable) = DISABLED (Disable all Timer 1
|
||||
// interrupt.)
|
||||
// ET2 (Timer 2 Interrupt Enable) = DISABLED (Disable Timer 2 interrupt.)
|
||||
// ET2 (Timer 2 Interrupt Enable) = ENABLED (Enable interrupt requests
|
||||
// generated by the TF2L or TF2H flags.)
|
||||
// ES0 (UART0 Interrupt Enable) = DISABLED (Disable UART0 interrupt.)
|
||||
*/
|
||||
IE = IE_EA__ENABLED | IE_EX0__DISABLED | IE_EX1__DISABLED
|
||||
| IE_ESPI0__DISABLED | IE_ET0__DISABLED | IE_ET1__DISABLED
|
||||
| IE_ET2__DISABLED | IE_ES0__DISABLED;
|
||||
| IE_ET2__ENABLED | IE_ES0__DISABLED;
|
||||
// [IE - Interrupt Enable]$
|
||||
|
||||
// $[IP - Interrupt Priority]
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
//=========================================================
|
||||
// src/Interrupts.c: generated by Hardware Configurator
|
||||
//
|
||||
// This file will be regenerated when saving a document.
|
||||
// leave the sections inside the "$[...]" comment tags alone
|
||||
// or they will be overwritten!
|
||||
//=========================================================
|
||||
|
||||
// USER INCLUDES
|
||||
#include <SI_EFM8UB1_Register_Enums.h>
|
||||
#include <stdint.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// TIMER2_ISR
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// TIMER2 ISR Content goes here. Remember to clear flag bits:
|
||||
// TMR2CN0::TF2H (Timer # High Byte Overflow Flag)
|
||||
// TMR2CN0::TF2L (Timer # Low Byte Overflow Flag)
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
uint16_t _MS_ = 0;
|
||||
|
||||
SI_INTERRUPT (TIMER2_ISR, TIMER2_IRQn)
|
||||
{
|
||||
TMR2CN0_TF2H = 0;
|
||||
++_MS_;
|
||||
}
|
||||
|
|
@ -3,6 +3,15 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "bsp.h"
|
||||
|
||||
|
||||
|
||||
void Delay(uint16_t ms) {
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
for (y = 0; y < ms; y++) {
|
||||
for (x = 0; x < 1000; x) {
|
||||
x++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,23 +20,11 @@
|
|||
#include "bsp.h"
|
||||
#include "descriptors.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Constants
|
||||
//-----------------------------------------------------------------------------
|
||||
#define HID_KEYBOARD_IFC 0
|
||||
//-----------------------------------------------------------------------------
|
||||
// Variables
|
||||
//-----------------------------------------------------------------------------
|
||||
// uint8_t thebuf1[32];
|
||||
SI_SEGMENT_VARIABLE(thebuf1[64], uint8_t, SI_SEG_XDATA);
|
||||
#define HID_INTERFACE_INDEX 0
|
||||
extern SI_SEGMENT_VARIABLE(appdata, struct APP_DATA, SI_SEG_XDATA);
|
||||
|
||||
uint8_t tmpBuffer;
|
||||
extern bool readpacket;
|
||||
//SI_SEGMENT_VARIABLE(thebuf1[32],
|
||||
// uint8_t,
|
||||
// SI_SEG_CODE);
|
||||
//-----------------------------------------------------------------------------
|
||||
// Functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
void USBD_EnterHandler(void) {
|
||||
|
||||
|
@ -65,16 +53,10 @@ bool USBD_IsSelfPoweredCb(void) {
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
USB_Status_TypeDef USBD_SetupCmdCb(
|
||||
SI_VARIABLE_SEGMENT_POINTER(setup, USB_Setup_TypeDef, MEM_MODEL_SEG)) {
|
||||
|
||||
USB_Status_TypeDef retVal = USB_STATUS_REQ_UNHANDLED;
|
||||
int i;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if ((setup->bmRequestType.Type == USB_SETUP_TYPE_STANDARD)
|
||||
|
@ -114,7 +96,7 @@ USB_Status_TypeDef USBD_SetupCmdCb(
|
|||
}
|
||||
else if ((setup->bmRequestType.Type == USB_SETUP_TYPE_CLASS)
|
||||
&& (setup->bmRequestType.Recipient == USB_SETUP_RECIPIENT_INTERFACE)
|
||||
&& (setup->wIndex == HID_KEYBOARD_IFC))
|
||||
&& (setup->wIndex == HID_INTERFACE_INDEX))
|
||||
{
|
||||
// Implement the necessary HID class specific commands.
|
||||
switch (setup->bRequest)
|
||||
|
@ -125,8 +107,6 @@ USB_Status_TypeDef USBD_SetupCmdCb(
|
|||
|
||||
case USB_HID_GET_REPORT:
|
||||
printf("input report\r\n");
|
||||
if ( USBD_Read(EP1OUT, thebuf1, sizeof(thebuf1), true) != USB_STATUS_OK)
|
||||
printf("ERROR not ready\n");
|
||||
|
||||
break;
|
||||
|
||||
|
@ -168,12 +148,6 @@ USB_Status_TypeDef USBD_SetupCmdCb(
|
|||
return retVal;
|
||||
}
|
||||
|
||||
//SI_SEGMENT_VARIABLE(testtx[],
|
||||
// uint8_t,
|
||||
// SI_SEG_CODE) =
|
||||
// "\x00\xff\xff\xff\xff\x86\x00\x08\x08\x07\x06\x05\x04\x03\x02\x01\x00\x00\x00\x00\x00\x00\x00"
|
||||
// "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
// "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
|
||||
|
||||
uint16_t USBD_XferCompleteCb(uint8_t epAddr, USB_Status_TypeDef status,
|
||||
uint16_t xferred, uint16_t remaining) {
|
||||
|
@ -187,14 +161,13 @@ uint16_t USBD_XferCompleteCb(uint8_t epAddr, USB_Status_TypeDef status,
|
|||
{
|
||||
printf("USBD_XferCompleteCb read 0x%x/0x%x \r\n", xferred, remaining);
|
||||
|
||||
for (i=0; i < sizeof(thebuf1); i++)
|
||||
for (i=0; i < sizeof(appdata.hidmsgbuf); i++)
|
||||
{
|
||||
uint16_t l = (uint8_t)thebuf1[i];
|
||||
uint16_t l = (uint8_t)appdata.hidmsgbuf[i];
|
||||
printf("%x",l);
|
||||
|
||||
}
|
||||
printf("\n");
|
||||
readpacket = 1;
|
||||
appdata.EP1_state = EP_FREE;
|
||||
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -1,299 +0,0 @@
|
|||
/**************************************************************************//**
|
||||
* Copyright (c) 2015 by Silicon Laboratories Inc. All rights reserved.
|
||||
*
|
||||
* http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt
|
||||
*****************************************************************************/
|
||||
#if 0
|
||||
#include <stdio.h>
|
||||
|
||||
#include "SI_EFM8UB1_Register_Enums.h"
|
||||
#include "efm8_usb.h"
|
||||
#include "descriptors.h"
|
||||
#include "idle.h"
|
||||
#include "bsp.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Constants
|
||||
// ----------------------------------------------------------------------------
|
||||
SI_SBIT(BSP_LED_G, SFR_P1, 4);
|
||||
SI_SBIT(BSP_LED_B, SFR_P1, 5);
|
||||
SI_SBIT(BSP_LED_R, SFR_P1, 6);
|
||||
|
||||
#define numLock BSP_LED_G
|
||||
#define capsLock BSP_LED_R
|
||||
|
||||
// Endpoint address of the HID keyboard IN endpoint
|
||||
#define KEYBOARD_IN_EP_ADDR EP1IN
|
||||
|
||||
// Interface number of the HID keyboard
|
||||
#define HID_KEYBOARD_IFC 0
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Variables
|
||||
// ----------------------------------------------------------------------------
|
||||
uint8_t tmpBuffer;
|
||||
extern uint8_t keySeqNo; // Current position in report table.
|
||||
extern bool keyPushed; // Current pushbutton status.
|
||||
|
||||
|
||||
uint8_t thebuf[32];
|
||||
// ----------------------------------------------------------------------------
|
||||
// Functions
|
||||
// ----------------------------------------------------------------------------
|
||||
void USBD_EnterHandler(void)
|
||||
{
|
||||
|
||||
// printf("USBD_EnterHandler\r\n");
|
||||
}
|
||||
|
||||
void USBD_ExitHandler(void)
|
||||
{
|
||||
// printf("USBD_ExitHandler\r\n");
|
||||
}
|
||||
|
||||
void USBD_ResetCb(void)
|
||||
{
|
||||
printf("USBD_ResetCb\r\n");
|
||||
}
|
||||
|
||||
void USBD_SofCb(uint16_t sofNr)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void USBD_DeviceStateChangeCb(USBD_State_TypeDef oldState,
|
||||
USBD_State_TypeDef newState)
|
||||
{
|
||||
bool numLockSave, capsLockSave;
|
||||
|
||||
printf("USBD_DeviceStateChangeCb\r\n");
|
||||
|
||||
// If not configured or in suspend, disable the LED
|
||||
if (newState < USBD_STATE_SUSPENDED)
|
||||
{
|
||||
// Disable the LED
|
||||
numLockSave = 1;
|
||||
capsLockSave = 1;
|
||||
numLock = 1;
|
||||
capsLock = 1;
|
||||
}
|
||||
// Entering suspend mode, power internal and external blocks down
|
||||
else if (newState == USBD_STATE_SUSPENDED)
|
||||
{
|
||||
// Disable the LED's
|
||||
numLockSave = numLock;
|
||||
capsLockSave = capsLock;
|
||||
numLock = 1;
|
||||
capsLock = 1;
|
||||
|
||||
// Abort any pending transfer
|
||||
USBD_AbortTransfer(KEYBOARD_IN_EP_ADDR);
|
||||
}
|
||||
else if (newState == USBD_STATE_CONFIGURED)
|
||||
{
|
||||
idleTimerSet(POLL_RATE);
|
||||
}
|
||||
|
||||
// Exiting suspend mode, power internal and external blocks up
|
||||
if (oldState == USBD_STATE_SUSPENDED)
|
||||
{
|
||||
// Restore the LED's to their previous values
|
||||
numLock = numLockSave;
|
||||
capsLock = capsLockSave;
|
||||
}
|
||||
}
|
||||
|
||||
bool USBD_IsSelfPoweredCb(void)
|
||||
{
|
||||
printf("USBD_IsSelfPoweredCb\r\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
void print_setup_packet(USB_Setup_TypeDef * setup)
|
||||
{
|
||||
uint16_t r = (uint8_t)setup->bmRequestType.Recipient;
|
||||
uint16_t t = (uint8_t)setup->bmRequestType.Type;
|
||||
uint16_t d = (uint8_t)setup->bmRequestType.Direction;
|
||||
uint16_t req = (uint8_t)setup->bRequest;
|
||||
uint16_t i = setup->wIndex;
|
||||
uint16_t l = setup->wLength;
|
||||
uint16_t val = setup->wValue;
|
||||
|
||||
printf("setup packet\r\n"
|
||||
" direction 0x%x\r\n"
|
||||
" type 0x%x\r\n"
|
||||
" recip inter 0x%x\r\n"
|
||||
" bRequest 0x%x\r\n"
|
||||
" value 0x%x\r\n"
|
||||
" index 0x%x\r\n"
|
||||
" length 0x%x\r\n"
|
||||
,d
|
||||
,t
|
||||
,r
|
||||
, req
|
||||
, val
|
||||
, i
|
||||
, l
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
USB_Status_TypeDef USBD_SetupCmdCb(SI_VARIABLE_SEGMENT_POINTER(
|
||||
setup,
|
||||
USB_Setup_TypeDef,
|
||||
MEM_MODEL_SEG))
|
||||
{
|
||||
|
||||
USB_Status_TypeDef retVal = USB_STATUS_REQ_UNHANDLED;
|
||||
|
||||
// print_setup_packet(setup);
|
||||
|
||||
|
||||
if ((setup->bmRequestType.Type == USB_SETUP_TYPE_STANDARD)
|
||||
&& (setup->bmRequestType.Direction == USB_SETUP_DIR_IN)
|
||||
&& (setup->bmRequestType.Recipient == USB_SETUP_RECIPIENT_INTERFACE))
|
||||
{
|
||||
// A HID device must extend the standard GET_DESCRIPTOR command
|
||||
// with support for HID descriptors.
|
||||
switch (setup->bRequest)
|
||||
{
|
||||
case GET_DESCRIPTOR:
|
||||
if ((setup->wValue >> 8) == USB_HID_REPORT_DESCRIPTOR)
|
||||
{
|
||||
switch (setup->wIndex)
|
||||
{
|
||||
case 0: // Interface 0
|
||||
|
||||
USBD_Write(EP0,
|
||||
ReportDescriptor0,
|
||||
EFM8_MIN(sizeof(ReportDescriptor0), setup->wLength),
|
||||
false);
|
||||
retVal = USB_STATUS_OK;
|
||||
printf("USBD_SetupCmdCb report D\r\n");
|
||||
break;
|
||||
|
||||
default: // Unhandled Interface
|
||||
printf("USBD_SetupCmdCb unhandled get descriptor %d\r\n", setup->wIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ((setup->wValue >> 8) == USB_HID_DESCRIPTOR)
|
||||
{
|
||||
switch (setup->wIndex)
|
||||
{
|
||||
case 0: // Interface 0
|
||||
|
||||
USBD_Write(EP0,
|
||||
(&configDesc[18]),
|
||||
EFM8_MIN(USB_HID_DESCSIZE, setup->wLength),
|
||||
false);
|
||||
retVal = USB_STATUS_OK;
|
||||
printf("get hid descsize\r\n");
|
||||
break;
|
||||
|
||||
default: // Unhandled Interface
|
||||
printf("Unhandled Interface\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("unhandled set up value %d\r\n", setup->wValue);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("USBD_SetupCmdCb setup->bRequest %d\r\n", setup->bRequest);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if ((setup->bmRequestType.Type == USB_SETUP_TYPE_CLASS)
|
||||
&& (setup->bmRequestType.Recipient == USB_SETUP_RECIPIENT_INTERFACE)
|
||||
&& (setup->wIndex == HID_KEYBOARD_IFC))
|
||||
{
|
||||
// Implement the necessary HID class specific commands.
|
||||
switch (setup->bRequest)
|
||||
{
|
||||
case USB_HID_SET_REPORT:
|
||||
printf("output report\r\n");
|
||||
break;
|
||||
|
||||
case USB_HID_GET_REPORT:
|
||||
printf("input report\r\n");
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case USB_HID_SET_IDLE:
|
||||
if (((setup->wValue & 0xFF) == 0) // Report ID
|
||||
&& (setup->wLength == 0)
|
||||
&& (setup->bmRequestType.Direction != USB_SETUP_DIR_IN))
|
||||
{
|
||||
printf("set idle\r\n");
|
||||
idleTimerSet(setup->wValue >> 8);
|
||||
retVal = USB_STATUS_OK;
|
||||
}
|
||||
else printf("unhandled USB_HID_SET_IDLE\r\n");
|
||||
break;
|
||||
|
||||
case USB_HID_GET_IDLE:
|
||||
if ((setup->wValue == 0) // Report ID
|
||||
&& (setup->wLength == 1)
|
||||
&& (setup->bmRequestType.Direction == USB_SETUP_DIR_IN))
|
||||
{
|
||||
printf("get idle\r\n");
|
||||
tmpBuffer = idleGetRate();
|
||||
USBD_Write(EP0, &tmpBuffer, 1, false);
|
||||
retVal = USB_STATUS_OK;
|
||||
}
|
||||
else printf("unhandled USB_HID_GET_IDLE\r\n");
|
||||
break;
|
||||
default:
|
||||
printf("unhandled setup->bRequest\r\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (setup->bmRequestType.Recipient == USB_SETUP_RECIPIENT_ENDPOINT)
|
||||
printf("endpoint called!\n");
|
||||
// printf("NOT HANDLED\r\n");
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint16_t USBD_XferCompleteCb(uint8_t epAddr,
|
||||
USB_Status_TypeDef status,
|
||||
uint16_t xferred,
|
||||
uint16_t remaining)
|
||||
{
|
||||
|
||||
int i = 0;
|
||||
UNREFERENCED_ARGUMENT(xferred);
|
||||
UNREFERENCED_ARGUMENT(remaining);
|
||||
|
||||
printf("USBD_XferCompleteCb\r\n");
|
||||
for (i=0; i < 32 ; i++)
|
||||
{
|
||||
|
||||
printf("%hhx", thebuf[i]);
|
||||
|
||||
}
|
||||
printf("\r\n");
|
||||
|
||||
if (status == USB_STATUS_OK)
|
||||
{
|
||||
// The only output reported supported is the SetReport to enable
|
||||
// Num Key and Caps Lock LED's.
|
||||
if (epAddr == EP0)
|
||||
{
|
||||
numLock = !((bool) (tmpBuffer & 0x01));
|
||||
capsLock = !((bool) (tmpBuffer & 0x02));
|
||||
}
|
||||
}
|
||||
// USBD_Read(EP0, thebuf, 32, true);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
|
@ -1,173 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* @file descriptors.c
|
||||
* @brief USB descriptors.
|
||||
*******************************************************************************/
|
||||
|
||||
//=============================================================================
|
||||
// src/descriptors.c: generated by Hardware Configurator
|
||||
//
|
||||
// This file is only generated if it does not exist. Modifications in this file
|
||||
// will persist even if Configurator generates code. To refresh this file,
|
||||
// you must first delete it and then regenerate code.
|
||||
//=============================================================================
|
||||
//-----------------------------------------------------------------------------
|
||||
// Includes
|
||||
//-----------------------------------------------------------------------------
|
||||
#if 0
|
||||
#include <si_toolchain.h>
|
||||
#include <endian.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <efm8_usb.h>
|
||||
#include "descriptors.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// HID Report Descriptor for Interface 0
|
||||
SI_SEGMENT_VARIABLE(ReportDescriptor0[34],
|
||||
const uint8_t,
|
||||
SI_SEG_CODE) =
|
||||
{
|
||||
|
||||
0x06, 0xd0, 0xf1,// USAGE_PAGE (FIDO Alliance)
|
||||
0x09, 0x01,// USAGE (Keyboard)
|
||||
0xa1, 0x01,// COLLECTION (Application)
|
||||
|
||||
0x09, 0x20, // USAGE (Input Report Data)
|
||||
0x15, 0x00, // LOGICAL_MINIMUM (0)
|
||||
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
|
||||
0x75, 0x08, // REPORT_SIZE (8)
|
||||
0x95, 0x40, // REPORT_COUNT (64)
|
||||
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||
0x09, 0x21, // USAGE(Output Report Data)
|
||||
0x15, 0x00, // LOGICAL_MINIMUM (0)
|
||||
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
|
||||
0x75, 0x08, // REPORT_SIZE (8)
|
||||
0x95, 0x40, // REPORT_COUNT (64)
|
||||
0x91, 0x02, // OUTPUT (Data,Var,Abs)
|
||||
|
||||
|
||||
0xc0,// END_COLLECTION
|
||||
|
||||
};
|
||||
|
||||
SI_SEGMENT_VARIABLE(deviceDesc[],
|
||||
const USB_DeviceDescriptor_TypeDef,
|
||||
SI_SEG_CODE) =
|
||||
{
|
||||
USB_DEVICE_DESCSIZE, // bLength
|
||||
USB_DEVICE_DESCRIPTOR,// bLength
|
||||
htole16(0x0200),// bcdUSB
|
||||
0,// bDeviceClass
|
||||
0,// bDeviceSubClass
|
||||
0,// bDeviceProtocol
|
||||
64,// bMaxPacketSize
|
||||
USB_VENDOR_ID,// idVendor
|
||||
USB_PRODUCT_ID,// idProduct
|
||||
htole16(0x0100),// bcdDevice
|
||||
1,// iManufacturer
|
||||
2,// iProduct
|
||||
0,// iSerialNumber
|
||||
1,// bNumConfigurations
|
||||
};
|
||||
|
||||
SI_SEGMENT_VARIABLE(configDesc[],
|
||||
const uint8_t,
|
||||
SI_SEG_CODE) =
|
||||
{
|
||||
USB_CONFIG_DESCSIZE, // bLength
|
||||
USB_CONFIG_DESCRIPTOR,// bLength
|
||||
0x29,// wTotalLength(LSB)
|
||||
0x00,// wTotalLength(MSB)
|
||||
1,// bNumInterfaces
|
||||
1,// bConfigurationValue
|
||||
0,// iConfiguration
|
||||
|
||||
CONFIG_DESC_BM_RESERVED_D7,// bmAttrib: Bus powered
|
||||
|
||||
CONFIG_DESC_MAXPOWER_mA(100),// bMaxPower: 100 mA
|
||||
|
||||
//Interface 0 Descriptor
|
||||
USB_INTERFACE_DESCSIZE,// bLength
|
||||
USB_INTERFACE_DESCRIPTOR,// bDescriptorType
|
||||
0,// bInterfaceNumber
|
||||
0,// bAlternateSetting
|
||||
2,// bNumEndpoints
|
||||
3,// bInterfaceClass: HID (Human Interface Device)
|
||||
0,// bInterfaceSubClass
|
||||
0,// bInterfaceProtocol
|
||||
0,// iInterface
|
||||
|
||||
//HID Descriptor
|
||||
USB_HID_DESCSIZE,// bLength
|
||||
USB_HID_DESCRIPTOR,// bLength
|
||||
0x11,// bcdHID (LSB)
|
||||
0x01,// bcdHID (MSB)
|
||||
0,// bCountryCode
|
||||
1,// bNumDescriptors
|
||||
USB_HID_REPORT_DESCRIPTOR,// bDescriptorType
|
||||
sizeof( ReportDescriptor0 ),// wDescriptorLength(LSB)
|
||||
sizeof( ReportDescriptor0 )>>8,// wDescriptorLength(MSB)
|
||||
|
||||
//Endpoint 1 IN Descriptor
|
||||
USB_ENDPOINT_DESCSIZE,// bLength
|
||||
USB_ENDPOINT_DESCRIPTOR,// bDescriptorType
|
||||
0x81,// bEndpointAddress
|
||||
USB_EPTYPE_INTR,// bAttrib
|
||||
0x40,// wMaxPacketSize (LSB)
|
||||
0x00,// wMaxPacketSize (MSB)
|
||||
5,// bInterval
|
||||
|
||||
//Endpoint 1 OUT Descriptor
|
||||
USB_ENDPOINT_DESCSIZE,// bLength
|
||||
USB_ENDPOINT_DESCRIPTOR,// bDescriptorType
|
||||
0x01,// bEndpointAddress
|
||||
USB_EPTYPE_INTR,// bAttrib
|
||||
0x40,// wMaxPacketSize (LSB)
|
||||
0x00,// wMaxPacketSize (MSB)
|
||||
5,// bInterval
|
||||
};
|
||||
|
||||
#define LANG_STRING htole16( SLAB_USB_LANGUAGE )
|
||||
#define MFR_STRING "Silicon Labs"
|
||||
#define PROD_STRING "U2F Zero"
|
||||
#define SER_STRING "0123456789ABCDEF"
|
||||
#define INT0_STRING "HID Keyboard"
|
||||
|
||||
LANGID_STATIC_CONST_STRING_DESC( langDesc[], LANG_STRING );
|
||||
UTF16LE_PACKED_STATIC_CONST_STRING_DESC( mfrDesc[], MFR_STRING );
|
||||
UTF16LE_PACKED_STATIC_CONST_STRING_DESC( prodDesc[], PROD_STRING );
|
||||
UTF16LE_PACKED_STATIC_CONST_STRING_DESC( serDesc[], SER_STRING );
|
||||
UTF16LE_PACKED_STATIC_CONST_STRING_DESC( int0Desc[], INT0_STRING );
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
SI_SEGMENT_POINTER(myUsbStringTable_USEnglish[],
|
||||
static const USB_StringDescriptor_TypeDef,
|
||||
const SI_SEG_CODE) =
|
||||
{
|
||||
langDesc,
|
||||
mfrDesc,
|
||||
prodDesc,
|
||||
serDesc,
|
||||
int0Desc,
|
||||
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
SI_SEGMENT_VARIABLE(initstruct,
|
||||
const USBD_Init_TypeDef,
|
||||
SI_SEG_CODE) =
|
||||
{
|
||||
deviceDesc, // deviceDescriptor
|
||||
configDesc,// configDescriptor
|
||||
myUsbStringTable_USEnglish,// stringDescriptors
|
||||
sizeof(myUsbStringTable_USEnglish) / sizeof(void *)// numberOfStrings
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -1,49 +1,3 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// main.c
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright 2014 Silicon Laboratories, Inc.
|
||||
// http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt
|
||||
//
|
||||
// Program Description:
|
||||
//
|
||||
// This program enumerates as a USB keyboard. Each time a button is pressed
|
||||
// a character is sent to the host. A series of presses will spell out
|
||||
// "HID Keyboard ". The status of the Caps Lock and Num Lock on the host will
|
||||
// be indicated by the color of the LED.
|
||||
//
|
||||
// Resources:
|
||||
// SYSCLK - 48 MHz HFOSC1 / 1
|
||||
// USB0 - Full speed
|
||||
// P0.2 - push button
|
||||
// P0.3 - push button
|
||||
// P2.3 - Display enable
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
// How To Test: EFM8UB1 STK
|
||||
//-----------------------------------------------------------------------------
|
||||
// 1) Place the switch in "AEM" mode.
|
||||
// 2) Connect the EFM8UB1 STK board to a PC using a mini USB cable.
|
||||
// 3) Compile and download code to the EFM8UB1 STK board.
|
||||
// In Simplicity Studio IDE, select Run -> Debug from the menu bar,
|
||||
// click the Debug button in the quick menu, or press F11.
|
||||
// 4) Run the code.
|
||||
// In Simplicity Studio IDE, select Run -> Resume from the menu bar,
|
||||
// click the Resume button in the quick menu, or press F8.
|
||||
// 5) The HID keyboard demo should start.
|
||||
// 6) Connect a micro USB cable from the PC to the STK.
|
||||
// 7) The device should enumerate on the PC as a HID keyboard.
|
||||
// 8) Press either push-button (PB0 or PB1) to send one character in the
|
||||
// string "HID Keyboard ".
|
||||
// 9) Pressing Caps Lock or Num Lock on the host keyboard will change the color
|
||||
// of the LED.
|
||||
//
|
||||
// Target: EFM8UB1
|
||||
// Tool chain: Generic
|
||||
//
|
||||
// Release 0.1 (JM)
|
||||
// - Initial Revision
|
||||
// - 26 JAN 2015
|
||||
//
|
||||
#include <SI_EFM8UB1_Register_Enums.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -59,46 +13,74 @@ bool keyPushed = 0; // Current pushbutton status.
|
|||
|
||||
bool readpacket = 1;
|
||||
|
||||
extern SI_SEGMENT_VARIABLE(thebuf1[64], uint8_t, SI_SEG_XDATA);
|
||||
SI_SEGMENT_VARIABLE(appdata, struct APP_DATA, SI_SEG_XDATA);
|
||||
|
||||
void Delay(int16_t ms) {
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
for (y = 0; y < ms; y++) {
|
||||
for (x = 0; x < 1000; x) {
|
||||
x++;
|
||||
}
|
||||
static void init(struct APP_DATA* ap)
|
||||
{
|
||||
memset(ap,0, sizeof(struct APP_DATA));
|
||||
ap->EP1_state = EP_FREE;
|
||||
}
|
||||
|
||||
void write_s_tx(char* d)
|
||||
{
|
||||
uint16_t i;
|
||||
while(*d)
|
||||
{
|
||||
// UART0 output queue
|
||||
SBUF0 = *d++;
|
||||
// 115200 baud , byte time ~ 7*10^-5 s * (48 MHz) ~ 3333 cycles
|
||||
for (i=0; i<200; i++);
|
||||
}
|
||||
}
|
||||
SI_SEGMENT_VARIABLE(mybuf[64],
|
||||
uint8_t,
|
||||
SI_SEG_CODE);
|
||||
|
||||
void listen_for_pkt(struct APP_DATA* ap)
|
||||
{
|
||||
if (USBD_Read(EP1OUT, ap->hidmsgbuf, sizeof(ap->hidmsgbuf), true) == USB_STATUS_OK)
|
||||
{
|
||||
ap->EP1_state = EP_BUSY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int16_t main(void) {
|
||||
int i = 0;
|
||||
|
||||
uint16_t i = 0;
|
||||
uint16_t last_ms = get_ms();
|
||||
uint16_t ms_since;
|
||||
|
||||
init(&appdata);
|
||||
|
||||
enter_DefaultMode_from_RESET();
|
||||
|
||||
SCON0_TI = 1; // This STDIO library requires TI to
|
||||
// be set for prints to occur
|
||||
// STDIO library requires TI to print
|
||||
SCON0_TI = 1;
|
||||
|
||||
// Enable interrupts
|
||||
IE_EA = 1;
|
||||
|
||||
printf("welcome \r\n");
|
||||
printf("Welcome\n");
|
||||
|
||||
while (1) {
|
||||
++i;
|
||||
ms_since = get_ms() - last_ms;
|
||||
|
||||
printf("%d\r\n", i);
|
||||
Delay(1000);
|
||||
|
||||
if (readpacket)
|
||||
if (ms_since > 499)
|
||||
{
|
||||
USBD_Read(EP1OUT, thebuf1, sizeof(thebuf1), true);
|
||||
readpacket = 0;
|
||||
printf("%d\r\n", ++i);
|
||||
last_ms = get_ms();
|
||||
}
|
||||
|
||||
|
||||
if ( USBD_GetUsbState() == USBD_STATE_CONFIGURED)
|
||||
{
|
||||
if (!USBD_EpIsBusy(EP1OUT))
|
||||
{
|
||||
listen_for_pkt(&appdata);
|
||||
write_s_tx("read added\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
SI_INTERRUPT(PMATCH_IrqHandler, PMATCH_IRQn) {
|
||||
keyPushed = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,9 +10,8 @@
|
|||
<property object="CROSSBAR0" propertyId="xbar0.uart0.data" value="Enabled"/>
|
||||
<property object="DefaultMode" propertyId="mode.diagramLocation" value="100, 100"/>
|
||||
<property object="INTERRUPT_0" propertyId="ABPeripheral.included" value="true"/>
|
||||
<property object="INTERRUPT_0" propertyId="interrupt.extendedinterruptenable1.enableportmatchinterrupts" value="Enabled"/>
|
||||
<property object="INTERRUPT_0" propertyId="interrupt.interruptenable.enableallinterrupts" value="Enabled"/>
|
||||
<property object="INTERRUPT_0" propertyId="interruptenables.codegenerationoptions.generateinterruptfunctions" value="Disabled"/>
|
||||
<property object="INTERRUPT_0" propertyId="interrupt.interruptenable.enabletimer2interrupt" value="Enabled"/>
|
||||
<property object="P0.2" propertyId="ports.settings.maskvalue" value="Compared"/>
|
||||
<property object="P0.3" propertyId="ports.settings.maskvalue" value="Compared"/>
|
||||
<property object="P0.4" propertyId="ports.settings.iomode" value="Digital Push-Pull Output"/>
|
||||
|
@ -23,9 +22,17 @@
|
|||
<property object="TIMER01_0" propertyId="timer01.timer1mode2:8bitcountertimerwithautoreload.targetoverflowfrequency" value="230400"/>
|
||||
<property object="TIMER01_0" propertyId="timer01.timer1mode2:8bitcountertimerwithautoreload.timerreloadvalue" value="48"/>
|
||||
<property object="TIMER16_2" propertyId="ABPeripheral.included" value="true"/>
|
||||
<property object="TIMER16_2" propertyId="timer16.control.clocksource" value="SYSCLK"/>
|
||||
<property object="TIMER16_2" propertyId="timer16.control.runcontrol" value="Start"/>
|
||||
<property object="TIMER16_2" propertyId="timer16.control.timerrunningstate" value="Timer is Running"/>
|
||||
<property object="TIMER16_2" propertyId="timer16.initandreloadvalue.targetoverflowfrequency" value="1000"/>
|
||||
<property object="TIMER16_2" propertyId="timer16.initandreloadvalue.timerreloadvalue" value="17536"/>
|
||||
<property object="TIMER16_2" propertyId="timer16.reloadhighbyte.reloadhighbyte" value="68"/>
|
||||
<property object="TIMER16_2" propertyId="timer16.reloadlowbyte.reloadlowbyte" value="128"/>
|
||||
<property object="TIMER16_3" propertyId="ABPeripheral.included" value="true"/>
|
||||
<property object="TIMER16_4" propertyId="ABPeripheral.included" value="true"/>
|
||||
<property object="TIMER_SETUP_0" propertyId="ABPeripheral.included" value="true"/>
|
||||
<property object="TIMER_SETUP_0" propertyId="timer_setup.clockcontrol.timer2lowbyteclockselect" value="Use SYSCLK"/>
|
||||
<property object="TIMER_SETUP_0" propertyId="timer_setup.timer01control.timer1runcontrol" value="Start"/>
|
||||
<property object="TIMER_SETUP_0" propertyId="timer_setup.timer1.clocksource" value="Use SYSCLK"/>
|
||||
<property object="TIMER_SETUP_0" propertyId="timer_setup.timer1.mode" value="Mode 2, 8-bit Counter/Timer with Auto-Reload"/>
|
||||
|
|
Ładowanie…
Reference in New Issue