cleaned up some

vtcsec_summit
Conor 2016-01-25 01:14:58 -05:00
rodzic f5334701d7
commit 68e1d59e12
12 zmienionych plików z 215 dodań i 609 usunięć

Wyświetl plik

@ -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>

Wyświetl plik

@ -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);

14
firmware/inc/app.h 100644
Wyświetl plik

@ -0,0 +1,14 @@
/*
* app.h
*
*/
#ifndef APP_H_
#define APP_H_
struct APP_DATA
{
};
#endif /* APP_H_ */

Wyświetl plik

@ -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_ */

Wyświetl plik

@ -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]

Wyświetl plik

@ -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_;
}

Wyświetl plik

@ -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++;
}
}
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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"/>