Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
31 changed files
with
8,579 additions
and
79 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
# Name: Makefile | ||
# Project: hid-data example | ||
# Author: Christian Starkjohann | ||
# Creation Date: 2008-04-07 | ||
# Tabsize: 4 | ||
# Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH | ||
# License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) | ||
# This Revision: $Id: Makefile 692 2008-11-07 15:07:40Z cs $ | ||
|
||
DEVICE = atmega168 | ||
F_CPU = 16000000 # in Hz | ||
FUSE_L = # see below for fuse values for particular devices | ||
FUSE_H = | ||
AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer | ||
|
||
CFLAGS = -Iusbdrv -I. -DDEBUG_LEVEL=0 | ||
OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o | ||
|
||
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) | ||
|
||
############################################################################## | ||
# Fuse values for particular devices | ||
############################################################################## | ||
# If your device is not listed here, go to | ||
# http://palmavr.sourceforge.net/cgi-bin/fc.cgi | ||
# and choose options for external crystal clock and no clock divider | ||
# | ||
################################## ATMega8 ################################## | ||
# ATMega8 FUSE_L (Fuse low byte): | ||
# 0x9f = 1 0 0 1 1 1 1 1 | ||
# ^ ^ \ / \--+--/ | ||
# | | | +------- CKSEL 3..0 (external >8M crystal) | ||
# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) | ||
# | +------------------ BODEN (BrownOut Detector enabled) | ||
# +-------------------- BODLEVEL (2.7V) | ||
# ATMega8 FUSE_H (Fuse high byte): | ||
# 0xc9 = 1 1 0 0 1 0 0 1 <-- BOOTRST (boot reset vector at 0x0000) | ||
# ^ ^ ^ ^ ^ ^ ^------ BOOTSZ0 | ||
# | | | | | +-------- BOOTSZ1 | ||
# | | | | + --------- EESAVE (don't preserve EEPROM over chip erase) | ||
# | | | +-------------- CKOPT (full output swing) | ||
# | | +---------------- SPIEN (allow serial programming) | ||
# | +------------------ WDTON (WDT not always on) | ||
# +-------------------- RSTDISBL (reset pin is enabled) | ||
# | ||
############################## ATMega48/88/168 ############################## | ||
# ATMega*8 FUSE_L (Fuse low byte): | ||
# 0xdf = 1 1 0 1 1 1 1 1 | ||
# ^ ^ \ / \--+--/ | ||
# | | | +------- CKSEL 3..0 (external >8M crystal) | ||
# | | +--------------- SUT 1..0 (crystal osc, BOD enabled) | ||
# | +------------------ CKOUT (if 0: Clock output enabled) | ||
# +-------------------- CKDIV8 (if 0: divide by 8) | ||
# ATMega*8 FUSE_H (Fuse high byte): | ||
# 0xde = 1 1 0 1 1 1 1 0 | ||
# ^ ^ ^ ^ ^ \-+-/ | ||
# | | | | | +------ BODLEVEL 0..2 (110 = 1.8 V) | ||
# | | | | + --------- EESAVE (preserve EEPROM over chip erase) | ||
# | | | +-------------- WDTON (if 0: watchdog always on) | ||
# | | +---------------- SPIEN (allow serial programming) | ||
# | +------------------ DWEN (debug wire enable) | ||
# +-------------------- RSTDISBL (reset pin is enabled) | ||
# | ||
############################## ATTiny25/45/85 ############################### | ||
# ATMega*5 FUSE_L (Fuse low byte): | ||
# 0xef = 1 1 1 0 1 1 1 1 | ||
# ^ ^ \+/ \--+--/ | ||
# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) | ||
# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) | ||
# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) | ||
# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) | ||
# ATMega*5 FUSE_H (Fuse high byte): | ||
# 0xdd = 1 1 0 1 1 1 0 1 | ||
# ^ ^ ^ ^ ^ \-+-/ | ||
# | | | | | +------ BODLEVEL 2..0 (brownout trigger level -> 2.7V) | ||
# | | | | +---------- EESAVE (preserve EEPROM on Chip Erase -> not preserved) | ||
# | | | +-------------- WDTON (watchdog timer always on -> disable) | ||
# | | +---------------- SPIEN (enable serial programming -> enabled) | ||
# | +------------------ DWEN (debug wire enable) | ||
# +-------------------- RSTDISBL (disable external reset -> enabled) | ||
# | ||
################################ ATTiny2313 ################################# | ||
# ATTiny2313 FUSE_L (Fuse low byte): | ||
# 0xef = 1 1 1 0 1 1 1 1 | ||
# ^ ^ \+/ \--+--/ | ||
# | | | +------- CKSEL 3..0 (clock selection -> crystal @ 12 MHz) | ||
# | | +--------------- SUT 1..0 (BOD enabled, fast rising power) | ||
# | +------------------ CKOUT (clock output on CKOUT pin -> disabled) | ||
# +-------------------- CKDIV8 (divide clock by 8 -> don't divide) | ||
# ATTiny2313 FUSE_H (Fuse high byte): | ||
# 0xdb = 1 1 0 1 1 0 1 1 | ||
# ^ ^ ^ ^ \-+-/ ^ | ||
# | | | | | +---- RSTDISBL (disable external reset -> enabled) | ||
# | | | | +-------- BODLEVEL 2..0 (brownout trigger level -> 2.7V) | ||
# | | | +-------------- WDTON (watchdog timer always on -> disable) | ||
# | | +---------------- SPIEN (enable serial programming -> enabled) | ||
# | +------------------ EESAVE (preserve EEPROM on Chip Erase -> not preserved) | ||
# +-------------------- DWEN (debug wire enable) | ||
|
||
|
||
# symbolic targets: | ||
help: | ||
@echo "This Makefile has no default rule. Use one of the following:" | ||
@echo "make hex ....... to build main.hex" | ||
@echo "make program ... to flash fuses and firmware" | ||
@echo "make fuse ...... to flash the fuses" | ||
@echo "make flash ..... to flash the firmware (use this on metaboard)" | ||
@echo "make clean ..... to delete objects and hex file" | ||
|
||
hex: main.hex | ||
|
||
program: flash fuse | ||
|
||
# rule for programming fuse bits: | ||
fuse: | ||
@[ "$(FUSE_H)" != "" -a "$(FUSE_L)" != "" ] || \ | ||
{ echo "*** Edit Makefile and choose values for FUSE_L and FUSE_H!"; exit 1; } | ||
$(AVRDUDE) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m | ||
|
||
# rule for uploading firmware: | ||
flash: main.hex | ||
$(AVRDUDE) -U flash:w:main.hex:i | ||
|
||
# rule for deleting dependent files (those which can be built by Make): | ||
clean: | ||
rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s | ||
|
||
# Generic rule for compiling C files: | ||
.c.o: | ||
$(COMPILE) -c $< -o $@ | ||
|
||
# Generic rule for assembling Assembler source files: | ||
.S.o: | ||
$(COMPILE) -x assembler-with-cpp -c $< -o $@ | ||
# "-x assembler-with-cpp" should not be necessary since this is the default | ||
# file type for the .S (with capital S) extension. However, upper case | ||
# characters are not always preserved on Windows. To ensure WinAVR | ||
# compatibility define the file type manually. | ||
|
||
# Generic rule for compiling C to assembler, used for debugging only. | ||
.c.s: | ||
$(COMPILE) -S $< -o $@ | ||
|
||
# file targets: | ||
|
||
# Since we don't want to ship the driver multipe times, we copy it into this project: | ||
usbdrv: | ||
cp -r ../../../usbdrv . | ||
|
||
main.elf: usbdrv $(OBJECTS) # usbdrv dependency only needed because we copy it | ||
$(COMPILE) -o main.elf $(OBJECTS) | ||
|
||
main.hex: main.elf | ||
rm -f main.hex main.eep.hex | ||
avr-objcopy -j .text -j .data -O ihex main.elf main.hex | ||
avr-size main.hex | ||
|
||
# debugging targets: | ||
|
||
disasm: main.elf | ||
avr-objdump -d main.elf | ||
|
||
cpp: | ||
$(COMPILE) -E main.c |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/* Name: main.c | ||
* Project: hid-data, example how to use HID for data transfer | ||
* Author: Christian Starkjohann | ||
* Creation Date: 2008-04-11 | ||
* Tabsize: 4 | ||
* Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH | ||
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) | ||
* This Revision: $Id: main.c 777 2010-01-15 18:34:48Z cs $ | ||
*/ | ||
|
||
/* | ||
This example should run on most AVRs with only little changes. No special | ||
hardware resources except INT0 are used. You may have to change usbconfig.h for | ||
different I/O pins for USB. Please note that USB D+ must be the INT0 pin, or | ||
at least be connected to INT0 as well. | ||
*/ | ||
|
||
#include <avr/io.h> | ||
#include <avr/wdt.h> | ||
#include <avr/interrupt.h> /* for sei() */ | ||
#include <util/delay.h> /* for _delay_ms() */ | ||
|
||
#include <avr/pgmspace.h> /* required by usbdrv.h */ | ||
#include "usbdrv.h" | ||
|
||
/* ------------------------------------------------------------------------- */ | ||
/* ----------------------------- USB interface ----------------------------- */ | ||
/* ------------------------------------------------------------------------- */ | ||
|
||
PROGMEM char usbHidReportDescriptor[22] = { /* USB report descriptor */ | ||
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) | ||
0x09, 0x01, // USAGE (Vendor Usage 1) | ||
0xa1, 0x01, // COLLECTION (Application) | ||
0x15, 0x00, // LOGICAL_MINIMUM (0) | ||
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) | ||
0x75, 0x08, // REPORT_SIZE (8) | ||
0x95, 0x80, // REPORT_COUNT (128) | ||
0x09, 0x00, // USAGE (Undefined) | ||
0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) | ||
0xc0 // END_COLLECTION | ||
}; | ||
/* Since we define only one feature report, we don't use report-IDs (which | ||
* would be the first byte of the report). The entire report consists of 128 | ||
* opaque data bytes. | ||
*/ | ||
|
||
uchar readValue; | ||
|
||
/* ------------------------------------------------------------------------- */ | ||
|
||
/* usbFunctionRead() is called when the host requests a chunk of data from | ||
* the device. For more information see the documentation in usbdrv/usbdrv.h. | ||
*/ | ||
uchar usbFunctionRead(uchar *data, uchar len) | ||
{ | ||
if (len > 0) { | ||
data[0] = readValue; | ||
} | ||
return len; | ||
} | ||
|
||
/* usbFunctionWrite() is called when the host sends a chunk of data to the | ||
* device. For more information see the documentation in usbdrv/usbdrv.h. | ||
*/ | ||
uchar usbFunctionWrite(uchar *data, uchar len) | ||
{ | ||
if (len > 0) { | ||
PORTC = (PORTC & 0xF0) | (data[0] & 0x03); // ....i0dd | ||
PORTC |= 0x04; // .....1.. TCK | ||
if ((data[0] & 4) == 4) { | ||
readValue = (PINC & 0x08) >> 3; | ||
} | ||
} | ||
return 1; | ||
} | ||
|
||
/* ------------------------------------------------------------------------- */ | ||
|
||
usbMsgLen_t usbFunctionSetup(uchar data[8]) | ||
{ | ||
usbRequest_t *rq = (void *)data; | ||
|
||
if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* HID class request */ | ||
if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */ | ||
/* since we have only one report type, we can ignore the report-ID */ | ||
return USB_NO_MSG; /* use usbFunctionRead() to obtain data */ | ||
}else if(rq->bRequest == USBRQ_HID_SET_REPORT){ | ||
/* since we have only one report type, we can ignore the report-ID */ | ||
return USB_NO_MSG; /* use usbFunctionWrite() to receive data from host */ | ||
} | ||
}else{ | ||
/* ignore vendor type requests, we don't use any */ | ||
} | ||
return 0; | ||
} | ||
|
||
/* ------------------------------------------------------------------------- */ | ||
|
||
int main(void) | ||
{ | ||
uchar i; | ||
|
||
wdt_enable(WDTO_1S); | ||
/* Even if you don't use the watchdog, turn it off here. On newer devices, | ||
* the status of the watchdog (on/off, period) is PRESERVED OVER RESET! | ||
*/ | ||
/* RESET status: all port bits are inputs without pull-up. | ||
* That's the way we need D+ and D-. Therefore we don't need any | ||
* additional hardware initialization. | ||
*/ | ||
DDRC = (DDRC & 0xF0) | 0x07; // ....0111 - TDO-TCK-TDI-TMS | ||
PORTC &= 0xF0; // TCK = TDI = TMS = 0, TDO pullup disabled | ||
usbInit(); | ||
usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ | ||
i = 0; | ||
while(--i){ /* fake USB disconnect for > 250 ms */ | ||
wdt_reset(); | ||
_delay_ms(1); | ||
} | ||
usbDeviceConnect(); | ||
sei(); | ||
for(;;){ /* main event loop */ | ||
wdt_reset(); | ||
usbPoll(); | ||
} | ||
return 0; | ||
} | ||
|
||
/* ------------------------------------------------------------------------- */ |
Oops, something went wrong.