diff options
Diffstat (limited to 'openpicc')
-rw-r--r-- | openpicc/Makefile.dfu | 566 | ||||
-rw-r--r-- | openpicc/application/flash.c | 68 | ||||
-rw-r--r-- | openpicc/application/flash.h | 5 | ||||
-rw-r--r-- | openpicc/application/main.c | 2 | ||||
-rw-r--r-- | openpicc/config/board.h | 19 | ||||
-rw-r--r-- | openpicc/dfu/dbgu.c | 140 | ||||
-rw-r--r-- | openpicc/dfu/dbgu.h | 25 | ||||
-rw-r--r-- | openpicc/dfu/dfu.c | 938 | ||||
-rw-r--r-- | openpicc/dfu/dfu.h | 143 | ||||
-rw-r--r-- | openpicc/dfu/usb_strings_dfu.h | 120 | ||||
-rw-r--r-- | openpicc/dfu/usb_strings_dfu.txt | 5 | ||||
-rw-r--r-- | openpicc/include/compile.h | 9 | ||||
-rw-r--r-- | openpicc/include/usb_ch9.h | 550 | ||||
-rw-r--r-- | openpicc/include/usb_dfu.h | 81 | ||||
-rw-r--r-- | openpicc/os/boot/Cstartup.S | 450 | ||||
-rw-r--r-- | openpicc/os/boot/Cstartup_SAM7.c | 101 | ||||
-rw-r--r-- | openpicc/os/boot/Cstartup_app.S | 194 |
17 files changed, 40 insertions, 3376 deletions
diff --git a/openpicc/Makefile.dfu b/openpicc/Makefile.dfu deleted file mode 100644 index 9a6f5fd..0000000 --- a/openpicc/Makefile.dfu +++ /dev/null @@ -1,566 +0,0 @@ -# Hey Emacs, this is a -*- makefile -*- -# -# WinARM makefile for the FreeRTOS-demo on LPC2138 -# based in information from the FreeRTOS LPC2106 example -# -# by Martin Thomas, Kaiserslautern, Germany -# <eversmith@heizung-thomas.de> -# -# based on the WinAVR makefile written by Eric B. Weddington, Jörg Wunsch, et al. -# Released to the Public Domain -# Please read the make user manual! -# -# -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make program = Download the hex file to the device -# -# (TODO: make filename.s = Just compile filename.c into the assembler code only) -# -# To rebuild project do "make clean" then "make all". -# -# Changelog: -# - 17. Feb. 2005 - added thumb-interwork support (mth) -# - 28. Apr. 2005 - added C++ support (mth) -# - 29. Arp. 2005 - changed handling for lst-Filename (mth) -# - 1. Nov. 2005 - exception-vector placement options (mth) -# - 15. Nov. 2005 - added library-search-path (EXTRA_LIB...) (mth) -# - 2. Dec. 2005 - fixed ihex and binary file extensions (mth) -# - 22. Feb. 2006 - added AT91LIBNOWARN setting (mth) -# - 19. Apr. 2006 - option FLASH_TOOL (default lpc21isp); variable IMGEXT (mth) -# - 19. Mai. 2006 - USE_THUMB_MODE switch, ROM_RUN->RUN_FROM_ROM RAM_RUN->RUN_FROM_RAM - - -FLASH_TOOL = AT91FLASH -#FLASH_TOOL = UVISION -#FLASH_TOOL = OPENOCD - -# MCU name and submodel -MCU = arm7tdmi -#SUBMDL = AT91SAM7S64 -SUBMDL = AT91SAM7S256 - -USE_THUMB_MODE = NO -#USE_THUMB_MODE = YES - -## Create ROM-Image (final) -RUN_MODE=RUN_FROM_ROM -## Create RAM-Image (debugging) - not used in this example -#RUN_MODE=RUN_FROM_RAM - -## We want to produce a full-flash image, but including DFU -IMGTYPE=-sam7dfu-dfu - -# with / at end -PATH_TO_LINKSCRIPTS=link/ - -#### not used in this example: -## Exception-Vector placement only supported for "ROM_RUN" -## (placement settings ignored when using "RAM_RUN") -## - Exception vectors in ROM: -#VECTOR_LOCATION=VECTORS_IN_ROM -## - Exception vectors in RAM: -#VECTOR_LOCATION=VECTORS_IN_RAM - -# Target file name (without extension). -TARGET:=dfu - -USBSTRINGS=dfu/usb_strings_dfu.h - -# List C source files here. (C dependencies are automatically generated.) -# use file-extension c for "c-only"-files -SRC = - -# List C source files here which must be compiled in ARM-Mode. -# use file-extension c for "c-only"-files - -SRCARM = os/boot/Cstartup_SAM7.c os/core/ARM7_AT91SAM7S/lib_AT91SAM7.c \ - dfu/dfu.c dfu/dbgu.c application/flash.c - -# List C++ source files here. -# use file-extension cpp for C++-files (use extension .cpp) -CPPSRC = - -# List C++ source files here which must be compiled in ARM-Mode. -# use file-extension cpp for C++-files (use extension .cpp) -#CPPSRCARM = $(TARGET).cpp -CPPSRCARM = - -# List Assembler source files here. -# Make them always end in a capital .S. Files ending in a lowercase .s -# will not be considered source files but generated files (assembler -# output from the compiler), and will be deleted upon "make clean"! -# Even though the DOS/Win* filesystem matches both .s and .S the same, -# it will preserve the spelling of the filenames, and gcc itself does -# care about how the name is spelled on its command-line. -ASRC = - -# List Assembler source files here which must be assembled in ARM-Mode.. -ASRCARM = os/boot/Cstartup.S - -ifeq ($(DEBUG),1) -SRCARM += lib/vsprintf.c lib/ctype.c lib/string.c -ASRCARM += lib/div64.S -endif - -## Output format. (can be ihex or binary) -## (binary i.e. for openocd and SAM-BA, hex i.e. for lpc21isp and uVision) -#FORMAT = ihex -FORMAT = binary - -# Optimization level, can be [0, 1, 2, 3, s]. -# 0 = turn off optimization. s = optimize for size. -# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) -OPT = s -#OPT = 0 - -# Debugging format. -# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. -# AVR (extended) COFF requires stabs, plus an avr-objcopy run. -#DEBUGF = stabs -DEBUGF = dwarf-2 - -# List any extra directories to look for include files here. -# Each directory must be seperated by a space. -#### FreeRTOS -EXTRAINCDIRS = os/core/ARM7_AT91SAM7S config - -# List any extra directories to look for library files here. -# Each directory must be seperated by a space. -#EXTRA_LIBDIRS = ../arm7_efsl_0_2_4 -EXTRA_LIBDIRS = - -## Using the Atmel AT91_lib produces warning with -## the default warning-levels. -## yes - disable these warnings; no - keep default settings -AT91LIBNOWARN = yes -#AT91LIBNOWARN = no - -# Compiler flag to set the C Standard level. -# c89 - "ANSI" C -# gnu89 - c89 plus GCC extensions -# c99 - ISO C99 standard (not yet fully implemented) -# gnu99 - c99 plus GCC extensions -CSTANDARD = -std=gnu99 - -# Place -D or -U options for C here -CDEFS = -D$(RUN_MODE) -D__MS_types__ -D__LIBRFID__ -DCONFIG_USB_STRING - -ifdef DEBUG -CDEFS += -DDEBUG -ADEFS += -DDEBUG -endif - -ifeq ($(BOARD),OLIMEX) -CDEFS += -DOLIMEX -ADEFS += -DOLIMEX -endif - -ifeq ($(BOARD),PICC) -CDEFS += -DPICC -ADEFS += -DPICC -CINCS = -Isrc/picc -endif - -ifeq ($(BOARD),PCD) -SUBMDL = AT91SAM7S128 -CDEFS += -DPCD -ADEFS += -DPCD -CINCS = -Isrc/pcd -endif - -# Place -I options here -CINCS += -Iinclude -Isrc - -# Place -D or -U options for ASM here -ADEFS += -D$(RUN_MODE) - -ifdef VECTOR_LOCATION -CDEFS += -D$(VECTOR_LOCATION) -ADEFS += -D$(VECTOR_LOCATION) -endif - -CDEFS += -D__$(SUBMDL)__ -ADEFS += -D__$(SUBMDL)__ - - -# Compiler flags. -# -g*: generate debugging information -# -O*: optimization level -# -f...: tuning, see GCC manual and avr-libc documentation -# -Wall...: warning level -# -Wa,...: tell GCC to pass this to the assembler. -# -adhlns...: create assembler listing -# -# Flags for C and C++ (arm-elf-gcc/arm-elf-g++) -CFLAGS += -g$(DEBUGF) -DBOARD=$(BOARD) -CFLAGS += $(CDEFS) $(CINCS) -CFLAGS += -O$(OPT) -CFLAGS += -Wall -Wextra -Wcast-align -Wimplicit -Wunused -CFLAGS += -Wpointer-arith -Wswitch -CFLAGS += -Wredundant-decls -Wreturn-type -Wshadow -CFLAGS += -Wbad-function-cast -Wsign-compare -Waggregate-return -CFLAGS += -Wa,-adhlns=$(subst $(suffix $<),.lst,$<) -CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) -#CFLAGS += -ffunction-sections -fdata-sections - -# flags only for C -CONLYFLAGS += -Wnested-externs -CONLYFLAGS += $(CSTANDARD) - -ifneq ($(AT91LIBNOWARN),yes) -#AT91-lib warnings with: -CFLAGS += -Wcast-qual -CONLYFLAGS += -Wmissing-prototypes -CONLYFLAGS += -Wstrict-prototypes -CONLYFLAGS += -Wmissing-declarations -endif - -# flags only for C++ (arm-elf-g++) -# CPPFLAGS = -fno-rtti -fno-exceptions -CPPFLAGS = - -# Assembler flags. -# -Wa,...: tell GCC to pass this to the assembler. -# -ahlns: create listing -# -g$(DEBUGF): have the assembler create line number information -ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:.S=.lst),--g$(DEBUGF) -Iinclude/ -D__ASSEMBLY__ - - -#Additional libraries. - -# Extra libraries -# Each library-name must be seperated by a space. -# To add libxyz.a, libabc.a and libefsl.a: -# EXTRA_LIBS = xyz abc efsl -#EXTRA_LIBS = efsl -EXTRA_LIBS = - -#Support for newlibc-lpc (file: libnewlibc-lpc.a) -#NEWLIBLPC = -lnewlib-lpc - -MATH_LIB = #-lm - -# CPLUSPLUS_LIB = -lstdc++ - - -# Linker flags. -# -Wl,...: tell GCC to pass this to linker. -# -Map: create map file -# --cref: add cross reference to map file -LDFLAGS = -nostartfiles -Wl,-Map=$(TARGET).map,--cref -LDFLAGS += $(NEWLIBLPC) $(MATH_LIB) -LDFLAGS += -lc -lgcc -LDFLAGS += $(CPLUSPLUS_LIB) -LDFLAGS += $(patsubst %,-L%,$(EXTRA_LIBDIRS)) -LDFLAGS += $(patsubst %,-l%,$(EXTRA_LIBS)) -#LDFLAGS += --gc-sections - -# Set Linker-Script Depending On Selected Memory and Controller -ifeq ($(RUN_MODE),RUN_FROM_RAM) -LDFLAGS +=-T$(PATH_TO_LINKSCRIPTS)$(SUBMDL)-RAM.ld -else -LDFLAGS +=-T$(PATH_TO_LINKSCRIPTS)$(SUBMDL)-ROM$(IMGTYPE).ld -endif - - -# --------------------------------------------------------------------------- -# Flash-Programming support using lpc21isp by Martin Maurer -# only for Philips LPC and Analog ADuC ARMs -# -# Settings and variables: -#LPC21ISP = lpc21isp -LPC21ISP = lpc21isp -LPC21ISP_PORT = com1 -LPC21ISP_BAUD = 38400 -LPC21ISP_XTAL = 12000 -LPC21ISP_FLASHFILE = $(TARGET).hex -# verbose output: -#LPC21ISP_DEBUG = -debug -# enter bootloader via RS232 DTR/RTS (only if hardware supports this -# feature - see Philips AppNote): -LPC21ISP_CONTROL = -control -# --------------------------------------------------------------------------- - - -# Define directories, if needed. -## DIRARM = c:/WinARM/ -## DIRARMBIN = $(DIRAVR)/bin/ -## DIRAVRUTILS = $(DIRAVR)/utils/bin/ - -# Define programs and commands. -SHELL = sh -CC = arm-elf-gcc -CPP = arm-elf-g++ -OBJCOPY = arm-elf-objcopy -OBJDUMP = arm-elf-objdump -SIZE = arm-elf-size -NM = arm-elf-nm -REMOVE = rm -f -COPY = cp - -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = "-------- begin (mode: $(RUN_MODE)) --------" -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_FLASH = Creating load file for Flash: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling C: -MSG_COMPILING_ARM = "Compiling C (ARM-only):" -MSG_COMPILINGCPP = Compiling C++: -MSG_COMPILINGCPP_ARM = "Compiling C++ (ARM-only):" -MSG_ASSEMBLING = Assembling: -MSG_ASSEMBLING_ARM = "Assembling (ARM-only):" -MSG_CLEANING = Cleaning project: -MSG_FORMATERROR = Can not handle output-format -MSG_LPC21_RESETREMINDER = You may have to bring the target in bootloader-mode now. - -# Define all object files. -COBJ = $(SRC:.c=.o) -AOBJ = $(ASRC:.S=.o) -COBJARM = $(SRCARM:.c=.o) -AOBJARM = $(ASRCARM:.S=.o) -CPPOBJ = $(CPPSRC:.cpp=.o) -CPPOBJARM = $(CPPSRCARM:.cpp=.o) - -# Define all listing files. -LST = $(ASRC:.S=.lst) $(ASRCARM:.S=.lst) $(SRC:.c=.lst) $(SRCARM:.c=.lst) -LST += $(CPPSRC:.cpp=.lst) $(CPPSRCARM:.cpp=.lst) - -# Compiler flags to generate dependency files. -### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d -GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d - -# Combine all necessary flags and optional flags. -# Add target processor to flags. -ALL_CFLAGS = -mcpu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) -ALL_ASFLAGS = -mcpu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) - - -# Default target. -all: begin gccversion sizebefore build sizeafter finished end - -ifeq ($(FORMAT),ihex) -build: elf hex lss sym -hex: $(TARGET).hex -IMGEXT=hex -else -ifeq ($(FORMAT),binary) -build: elf bin lss sym -bin: $(TARGET).bin -IMGEXT=bin -else -$(error "$(MSG_FORMATERROR) $(FORMAT)") -endif -endif - -elf: $(TARGET).elf -lss: $(TARGET).lss -sym: $(TARGET).sym - -# Eye candy. -begin: - @echo - @echo $(MSG_BEGIN) - -finished: - @echo $(MSG_ERRORS_NONE) - -end: - @echo $(MSG_END) - @echo - - -# Display size of file. -HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex -ELFSIZE = $(SIZE) -A $(TARGET).elf -sizebefore: - @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi - -sizeafter: - @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi - - -# Display compiler version information. -gccversion : - @$(CC) --version - - -# Program the device. -# Program the device by using our relais card robot over USB -ifeq ($(FLASH_TOOL),AT91FLASH) -program: $(TARGET).$(IMGEXT) - ls -l $(TARGET).$(IMGEXT) - at91flash $(TARGET).$(IMGEXT) -else -ifeq ($(FLASH_TOOL),UVISION) -# Program the device with Keil's uVision (needs configured uVision-Workspace). -program: $(TARGET).$(IMGEXT) - @echo - @echo "Programming with uVision" - C:\Keil\uv3\Uv3.exe -f uvisionflash.Uv2 -ouvisionflash.txt -else -ifeq ($(FLASH_TOOL),OPENOCD) -# Program the device with Dominic Rath's OPENOCD in "batch-mode", needs cfg and "reset-script". -program: $(TARGET).$(IMGEXT) - @echo - @echo "Programming with OPENOCD" - C:\WinARM\utils\openocd\openocd_svn59\openocd.exe -f oocd_sam7_flash.cfg -else -# Program the device. - lpc21isp will not work for SAM7 -program: $(TARGET).$(IMGEXT) - @echo - @echo $(MSG_LPC21_RESETREMINDER) - $(LPC21ISP) $(LPC21ISP_OPTIONS) $(LPC21ISP_DEBUG) $(LPC21ISP_FLASHFILE) $(LPC21ISP_PORT) $(LPC21ISP_BAUD) $(LPC21ISP_XTAL) -endif -endif -endif - - -# Create final output file (.hex) from ELF output file. -%.hex: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) $< $@ - -# Create final output file (.bin) from ELF output file. -%.bin: %.elf - @echo - @echo $(MSG_FLASH) $@ - $(OBJCOPY) -O $(FORMAT) $< $@ - - -# Create extended listing file from ELF output file. -# testing: option -C -%.lss: %.elf - @echo - @echo $(MSG_EXTENDED_LISTING) $@ - $(OBJDUMP) -h -S -C $< > $@ - - -# Create a symbol table from ELF output file. -%.sym: %.elf - @echo - @echo $(MSG_SYMBOL_TABLE) $@ - $(NM) -n $< > $@ - - -# Link: create ELF output file from object files. -.SECONDARY : $(TARGET).elf -.PRECIOUS : $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) -%.elf: $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) - @echo - @echo $(MSG_LINKING) $@ - $(CC) $(ALL_CFLAGS) $(AOBJARM) $(AOBJ) $(COBJARM) $(COBJ) $(CPPOBJ) $(CPPOBJARM) --output $@ $(LDFLAGS) - -# Compile: create object files from C source files. ARM/Thumb -$(COBJ) : %.o : %.c - @echo - @echo $(MSG_COMPILING) $< - $(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ - -# Compile: create object files from C source files. ARM-only -$(COBJARM) : %.o : %.c include/compile.h $(USBSTRINGS) - @echo - @echo $(MSG_COMPILING_ARM) $< - $(CC) -c $(ALL_CFLAGS) $(CONLYFLAGS) $< -o $@ - -# Compile: create object files from C++ source files. ARM/Thumb -$(CPPOBJ) : %.o : %.cpp - @echo - @echo $(MSG_COMPILINGCPP) $< - $(CPP) -c $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@ - -# Compile: create object files from C++ source files. ARM-only -$(CPPOBJARM) : %.o : %.cpp - @echo - @echo $(MSG_COMPILINGCPP_ARM) $< - $(CPP) -c $(ALL_CFLAGS) $(CPPFLAGS) $< -o $@ - - -# Compile: create assembler files from C source files. ARM/Thumb -## does not work - TODO - hints welcome -##$(COBJ) : %.s : %.c -## $(CC) $(THUMB) -S $(ALL_CFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. ARM/Thumb -$(AOBJ) : %.o : %.S - @echo - @echo $(MSG_ASSEMBLING) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Assemble: create object files from assembler source files. ARM-only -$(AOBJARM) : %.o : %.S - @echo - @echo $(MSG_ASSEMBLING_ARM) $< - $(CC) -c $(ALL_ASFLAGS) $< -o $@ - - -# Target: clean project. -clean: begin clean_list finished end - - -clean_list : - @echo - @echo $(MSG_CLEANING) - $(REMOVE) $(TARGET).hex - $(REMOVE) $(TARGET).bin - $(REMOVE) $(TARGET).obj - $(REMOVE) $(TARGET).elf - $(REMOVE) $(TARGET).map - $(REMOVE) $(TARGET).obj - $(REMOVE) $(TARGET).a90 - $(REMOVE) $(TARGET).sym - $(REMOVE) $(TARGET).lnk - $(REMOVE) $(TARGET).lss - $(REMOVE) $(COBJ) - $(REMOVE) $(CPPOBJ) - $(REMOVE) $(AOBJ) - $(REMOVE) $(COBJARM) - $(REMOVE) $(CPPOBJARM) - $(REMOVE) $(AOBJARM) - $(REMOVE) $(LST) - $(REMOVE) $(SRC:.c=.s) - $(REMOVE) $(SRC:.c=.d) - $(REMOVE) $(SRCARM:.c=.s) - $(REMOVE) $(SRCARM:.c=.d) - $(REMOVE) $(CPPSRC:.cpp=.s) - $(REMOVE) $(CPPSRC:.cpp=.d) - $(REMOVE) $(CPPSRCARM:.cpp=.s) - $(REMOVE) $(CPPSRCARM:.cpp=.d) - $(REMOVE) .dep/* - $(REMOVE) src/picc/usb_strings_dfu.h - $(REMOVE) src/dfu/usb_strings_dfu.h - $(REMOVE) scripts/usbstring - -.PHONY: include/compile.h -include/compile.h: - scripts/mkcompile_h > $@ - -.PHONY: -$(USBSTRINGS): %.h : %.txt ./scripts/usbstring - cat $< | ./scripts/usbstring > $@ - -scripts/usbstring: scripts/usbstring.c - gcc $^ -o $@ - - -# Include the dependency files. --include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) - - -# Listing of phony targets. -.PHONY : all begin finish end sizebefore sizeafter gccversion \ -build elf hex bin lss sym clean clean_list program - diff --git a/openpicc/application/flash.c b/openpicc/application/flash.c deleted file mode 100644 index c729ff8..0000000 --- a/openpicc/application/flash.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <sys/types.h> -#include <lib_AT91SAM7.h> -#include <AT91SAM7.h> -#include <dfu/dbgu.h> -#include <board.h> - -#define EFCS_CMD_WRITE_PAGE 0x1 -#define EFCS_CMD_SET_LOCK_BIT 0x2 -#define EFCS_CMD_WRITE_PAGE_LOCK 0x3 -#define EFCS_CMD_CLEAR_LOCK 0x4 -#define EFCS_CMD_ERASE_ALL 0x8 -#define EFCS_CMD_SET_NVM_BIT 0xb -#define EFCS_CMD_CLEAR_NVM_BIT 0xd -#define EFCS_CMD_SET_SECURITY_BIT 0xf - -static u_int16_t page_from_ramaddr(const void *addr) -{ - u_int32_t ramaddr = (u_int32_t) addr; - ramaddr -= (u_int32_t) AT91C_IFLASH; - return ((ramaddr >> AT91C_IFLASH_PAGE_SHIFT)); -} -#define PAGES_PER_LOCKREGION (AT91C_IFLASH_LOCK_REGION_SIZE>>AT91C_IFLASH_PAGE_SHIFT) -#define IS_FIRST_PAGE_OF_LOCKREGION(x) ((x % PAGES_PER_LOCKREGION) == 0) -#define LOCKREGION_FROM_PAGE(x) (x / PAGES_PER_LOCKREGION) - -static int is_page_locked(u_int16_t page) -{ - u_int16_t lockregion = LOCKREGION_FROM_PAGE(page); - - return (AT91C_BASE_MC->MC_FSR & (lockregion << 16)); -} - -static void unlock_page(u_int16_t page) -{ - page &= 0x3ff; - AT91F_MC_EFC_PerformCmd(AT91C_BASE_MC, AT91C_MC_FCMD_UNLOCK | - AT91C_MC_CORRECT_KEY | (page << 8)); -} - -void flash_page(u_int8_t *addr) -{ - u_int16_t page = page_from_ramaddr(addr) & 0x3ff; - u_int32_t fsr = AT91F_MC_EFC_GetStatus(AT91C_BASE_MC); - DEBUGP("flash_page(0x%x=%u) ", addr, page); - - if (is_page_locked(page)) { - DEBUGP("unlocking "); - unlock_page(page); - } - - if (!(fsr & AT91C_MC_FRDY)) { - DEBUGP("NOT_FLASHING "); - return; - } - - DEBUGP("performing start_prog "); - - AT91F_MC_EFC_PerformCmd(AT91C_BASE_MC, AT91C_MC_FCMD_START_PROG | - AT91C_MC_CORRECT_KEY | (page << 8)); -} - -void flash_init(void) -{ - unsigned int fmcn = AT91F_MC_EFC_ComputeFMCN(MCK); - - AT91F_MC_EFC_CfgModeReg(AT91C_BASE_MC, (fmcn&0xff) << 16 | - AT91C_MC_FWS_3FWS); -} diff --git a/openpicc/application/flash.h b/openpicc/application/flash.h deleted file mode 100644 index b812714..0000000 --- a/openpicc/application/flash.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _FLASH_H -#define _FLASH_H -extern void flash_page(u_int8_t *addr); -extern void flash_init(void); -#endif diff --git a/openpicc/application/main.c b/openpicc/application/main.c index d69fc1e..9af44bf 100644 --- a/openpicc/application/main.c +++ b/openpicc/application/main.c @@ -39,7 +39,7 @@ #include "env.h" #include "cmd.h" #include "da.h" -#include "pll.h" +//#include "pll.h" /**********************************************************************/ static inline void prvSetupHardware (void) diff --git a/openpicc/config/board.h b/openpicc/config/board.h index c052d1e..065c26d 100644 --- a/openpicc/config/board.h +++ b/openpicc/config/board.h @@ -61,25 +61,6 @@ #define OPENPICC_PIO_PLL_INHIBIT AT91C_PIO_PA24 #define OPENPICC_PIO_PLL_LOCK AT91C_PIO_PA4 -#define OPENPCD_PIO_UDP_CNX NO_UDP_CNX -#define OPENPCD_PIO_UDP_PUPv4 AT91C_PIO_PA16 -#define OPENPCD_PIO_LED1 AT91C_PIO_PA25 -#define OPENPCD_PIO_LED2 AT91C_PIO_PA12 -#define PIO_BOOTLDR AT91C_PIO_PA6 - -#define OPENPCD_VENDOR_ID 0x16c0 -#define OPENPCD_PRODUCT_ID 0x076b -#define OPENPICC_PRODUCT_ID 0x076c - -#define USB_PRODUCT_ID OPENPICC_PRODUCT_ID -#define USB_VENDOR_ID OPENPCD_VENDOR_ID - -/*----------------------*/ -/* interrupt priorities */ -/*----------------------*/ - -#define OPENPCD_IRQ_PRIO_UDP (AT91C_AIC_PRIOR_LOWEST+2) - /*-----------------*/ /* task priorities */ /*-----------------*/ diff --git a/openpicc/dfu/dbgu.c b/openpicc/dfu/dbgu.c deleted file mode 100644 index ded704b..0000000 --- a/openpicc/dfu/dbgu.c +++ /dev/null @@ -1,140 +0,0 @@ -/* AT91SAM7 debug function implementation for OpenPCD - * (C) 2006 by Harald Welte <hwelte@hmw-consulting.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include <lib_AT91SAM7.h> -#include <board.h> -#include <dfu/dbgu.h> -#include <stdarg.h> -#include <stdio.h> -#include <string.h> - -#define USART_SYS_LEVEL 4 -void AT91F_DBGU_Ready(void) -{ - while (!(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXEMPTY)) ; -} - -static void DBGU_irq_handler(void) -{ - static char value; - - AT91F_DBGU_Get(&value); - switch (value) { - case '9': - AT91F_DBGU_Printk("Resetting SAM7\n\r"); - AT91F_RSTSoftReset(AT91C_BASE_RSTC, AT91C_RSTC_PROCRST| - AT91C_RSTC_PERRST|AT91C_RSTC_EXTRST); - break; - default: - AT91F_DBGU_Printk("\n\r"); - } -} - -void AT91F_DBGU_Init(void) -{ - /* Open PIO for DBGU */ - AT91F_DBGU_CfgPIO(); - /* Enable Transmitter & receivier */ - ((AT91PS_USART) AT91C_BASE_DBGU)->US_CR = - AT91C_US_RSTTX | AT91C_US_RSTRX; - - /* Configure DBGU */ - AT91F_US_Configure(AT91C_BASE_DBGU, - MCK, AT91C_US_ASYNC_MODE, - AT91C_DBGU_BAUD, 0); - - /* Enable Transmitter & receivier */ - ((AT91PS_USART) AT91C_BASE_DBGU)->US_CR = - AT91C_US_RXEN | AT91C_US_TXEN; - - /* Enable USART IT error and AT91C_US_ENDRX */ - AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU, AT91C_US_RXRDY); - - /* open interrupt */ - - AT91F_AIC_ConfigureIt(AT91C_ID_SYS, USART_SYS_LEVEL, - AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, - DBGU_irq_handler); - AT91F_AIC_EnableIt(AT91C_ID_SYS); - -} - -void AT91F_DBGU_Printk(char *buffer) -{ - while (*buffer != '\0') { - while (!AT91F_US_TxReady((AT91PS_USART) AT91C_BASE_DBGU)) ; - AT91F_US_PutChar((AT91PS_USART) AT91C_BASE_DBGU, *buffer++); - } -} - -int AT91F_DBGU_Get(char *val) -{ - if ((AT91F_US_RxReady((AT91PS_USART) AT91C_BASE_DBGU)) == 0) - return (0); - else { - *val = AT91F_US_GetChar((AT91PS_USART) AT91C_BASE_DBGU); - return (-1); - } -} - -#ifdef DEBUG - -void AT91F_DBGU_Frame(char *buffer) -{ - unsigned char len; - - for (len = 0; buffer[len] != '\0'; len++) { } - - AT91F_US_SendFrame((AT91PS_USART) AT91C_BASE_DBGU, - (unsigned char *)buffer, len, 0, 0); -} - - -const char * -hexdump(const void *data, unsigned int len) -{ - static char string[256]; - unsigned char *d = (unsigned char *) data; - unsigned int i, left; - - string[0] = '\0'; - left = sizeof(string); - for (i = 0; len--; i += 3) { - if (i >= sizeof(string) -4) - break; - snprintf(string+i, 4, " %02x", *d++); - } - return string; -} - -static char dbg_buf[2048]; -void debugp(const char *format, ...) -{ - va_list ap; - - va_start(ap, format); - vsnprintf(dbg_buf, sizeof(dbg_buf)-1, format, ap); - va_end(ap); - - dbg_buf[sizeof(dbg_buf)-1] = '\0'; - //AT91F_DBGU_Frame(dbg_buf); - AT91F_DBGU_Printk(dbg_buf); -} - -#endif diff --git a/openpicc/dfu/dbgu.h b/openpicc/dfu/dbgu.h deleted file mode 100644 index 5ec8a49..0000000 --- a/openpicc/dfu/dbgu.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef dbgu_h -#define dbgu_h - -#define AT91C_DBGU_BAUD 115200 - -#define DEBUGP(x, args ...) debugp(x, ## args) -#define DEBUGPCR(x, args ...) DEBUGP(x "\r\n", ## args) -#define DEBUGPCRF(x, args ...) DEBUGPCR("%s(%d): " x, __FUNCTION__, __LINE__, ## args) - -extern void AT91F_DBGU_Init(void); -extern void AT91F_DBGU_Printk(char *buffer); -extern int AT91F_DBGU_Get(char *val); -extern void AT91F_DBGU_Ready(void); - -#ifdef DEBUG -extern void debugp(const char *format, ...); -extern const char *hexdump(const void *data, unsigned int len); -extern void AT91F_DBGU_Frame(char *buffer); -#else -#define debugp(x, args ...) -#define hexdump(x, args ...) -#define AT91F_DBGU_Frame(x) -#endif - -#endif /* dbgu_h */ diff --git a/openpicc/dfu/dfu.c b/openpicc/dfu/dfu.c deleted file mode 100644 index af09a62..0000000 --- a/openpicc/dfu/dfu.c +++ /dev/null @@ -1,938 +0,0 @@ -/* USB Device Firmware Update Implementation for OpenPCD - * (C) 2006 by Harald Welte <hwelte@hmw-consulting.de> - * - * This ought to be compliant to the USB DFU Spec 1.0 as available from - * http://www.usb.org/developers/devclass_docs/usbdfu10.pdf - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include <errno.h> -#include <usb_ch9.h> -#include <usb_dfu.h> -#include <board.h> -#include <lib_AT91SAM7.h> - -#include "usb_strings_dfu.h" - -#include <dfu/dfu.h> -#include <dfu/dbgu.h> -#include <application/flash.h> -//#include <os/pcd_enumerate.h> -//#include "../openpcd.h" - -#include <compile.h> - -#define SAM7DFU_SIZE 0x4000 - -/* If debug is enabled, we need to access debug functions from flash - * and therefore have to omit flashing */ -#define DEBUG_DFU_NOFLASH - -#ifdef DEBUG -#define DEBUG_DFU_EP0 -//#define DEBUG_DFU_RECV -#endif - -#ifdef DEBUG_DFU_EP0 -#define DEBUGE DEBUGP -#else -#define DEBUGE(x, args ...) -#endif - -#ifdef DEBUG_DFU_RECV -#define DEBUGR DEBUGP -#else -#define DEBUGR(x, args ...) -#endif - -#define RET_NOTHING 0 -#define RET_ZLP 1 -#define RET_STALL 2 - -#define led1on() AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, OPENPCD_PIO_LED1) -#define led1off() AT91F_PIO_SetOutput(AT91C_BASE_PIOA, OPENPCD_PIO_LED1) - -#define led2on() AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, OPENPCD_PIO_LED2) -#define led2off() AT91F_PIO_SetOutput(AT91C_BASE_PIOA, OPENPCD_PIO_LED2) - -static void __dfufunc udp_init(void) -{ - /* Set the PLL USB Divider */ - AT91C_BASE_CKGR->CKGR_PLLR |= AT91C_CKGR_USBDIV_1; - - /* Enables the 48MHz USB clock UDPCK and System Peripheral USB Clock */ - AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; - AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP); - - /* Enable UDP PullUp (USB_DP_PUP) : enable & Clear of the - * corresponding PIO Set in PIO mode and Configure in Output */ -#if defined(PCD) - AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OPENPCD_PIO_UDP_PUP); -#endif - AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OPENPCD_PIO_UDP_PUPv4); -} - -/* Send Data through the control endpoint */ -static void __dfufunc udp_ep0_send_data(const char *pData, u_int32_t length) -{ - AT91PS_UDP pUdp = AT91C_BASE_UDP; - u_int32_t cpt = 0; - AT91_REG csr; - - DEBUGE("send_data: %u bytes ", length); - - do { - cpt = MIN(length, 8); - length -= cpt; - - while (cpt--) - pUdp->UDP_FDR[0] = *pData++; - - if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) { - pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) ; - } - - pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY; - do { - csr = pUdp->UDP_CSR[0]; - - /* Data IN stage has been stopped by a status OUT */ - if (csr & AT91C_UDP_RX_DATA_BK0) { - pUdp->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0); - DEBUGE("stopped by status out "); - return; - } - } while (!(csr & AT91C_UDP_TXCOMP)); - - } while (length); - - if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) { - pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) ; - } -} - -static void udp_ep0_recv_clean(void) -{ - unsigned int i; - u_int8_t dummy; - const AT91PS_UDP pUdp = AT91C_BASE_UDP; - - while (!(pUdp->UDP_CSR[0] & AT91C_UDP_RX_DATA_BK0)) ; - - for (i = 0; i < (pUdp->UDP_CSR[0] >> 16); i++) - dummy = pUdp->UDP_FDR[0]; - - pUdp->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0); -} - -/* receive data from EP0 */ -static int __dfufunc udp_ep0_recv_data(u_int8_t *data, u_int16_t len) -{ - AT91PS_UDP pUdp = AT91C_BASE_UDP; - AT91_REG csr; - u_int16_t i, num_rcv; - u_int32_t num_rcv_total = 0; - - do { - /* FIXME: do we need to check whether we've been interrupted - * by a RX SETUP stage? */ - do { - csr = pUdp->UDP_CSR[0]; - DEBUGR("CSR=%08x ", csr); - } while (!(csr & AT91C_UDP_RX_DATA_BK0)) ; - - num_rcv = pUdp->UDP_CSR[0] >> 16; - - /* make sure we don't read more than requested */ - if (num_rcv_total + num_rcv > len) - num_rcv = num_rcv_total - len; - - DEBUGR("num_rcv = %u ", num_rcv); - for (i = 0; i < num_rcv; i++) - *data++ = pUdp->UDP_FDR[0]; - pUdp->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0); - - num_rcv_total += num_rcv; - - /* we need to continue to pull data until we either receive - * a packet < endpoint size or == 0 */ - } while (num_rcv == 8 && num_rcv_total < len); - - DEBUGE("ep0_rcv_returning(%u total) ", num_rcv_total); - - return num_rcv_total; -} - -/* Send zero length packet through the control endpoint */ -static void __dfufunc udp_ep0_send_zlp(void) -{ - AT91PS_UDP pUdp = AT91C_BASE_UDP; - pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY; - while (!(pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP)) ; - pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP); - while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) ; -} - -/* Stall the control endpoint */ -static void __dfufunc udp_ep0_send_stall(void) -{ - AT91PS_UDP pUdp = AT91C_BASE_UDP; - pUdp->UDP_CSR[0] |= AT91C_UDP_FORCESTALL; - while (!(pUdp->UDP_CSR[0] & AT91C_UDP_ISOERROR)) ; - pUdp->UDP_CSR[0] &= ~(AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR); - while (pUdp->UDP_CSR[0] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR)) ; -} - - -static u_int8_t *ptr = (u_int8_t *) AT91C_IFLASH + SAM7DFU_SIZE; -static __dfudata u_int8_t dfu_status; -__dfudata u_int32_t dfu_state = DFU_STATE_appIDLE; -static u_int32_t pagebuf32[AT91C_IFLASH_PAGE_SIZE/4]; - -static int __dfufunc handle_dnload(u_int16_t val, u_int16_t len) -{ - volatile u_int32_t *p = (volatile u_int32_t *)ptr; - u_int8_t *pagebuf = (u_int8_t *) pagebuf32; - int i; - - DEBUGE("download "); - - if (len > AT91C_IFLASH_PAGE_SIZE) { - /* Too big. Not that we'd really care, but it's a - * DFU protocol violation */ - DEBUGP("length exceeds flash page size "); - dfu_state = DFU_STATE_dfuERROR; - dfu_status = DFU_STATUS_errADDRESS; - return RET_STALL; - } - if (len & 0x3) { - /* reject non-four-byte-aligned writes */ - DEBUGP("not four-byte-aligned length "); - dfu_state = DFU_STATE_dfuERROR; - dfu_status = DFU_STATUS_errADDRESS; - return RET_STALL; - } - if (len == 0) { - DEBUGP("zero-size write -> MANIFEST_SYNC "); - flash_page(p); - dfu_state = DFU_STATE_dfuMANIFEST_SYNC; - return RET_ZLP; - } - if (ptr + len >= (u_int8_t *) AT91C_IFLASH + AT91C_IFLASH_SIZE - ENVIRONMENT_SIZE ) { - DEBUGP("end of write exceeds flash end "); - dfu_state = DFU_STATE_dfuERROR; - dfu_status = DFU_STATUS_errADDRESS; - return RET_STALL; - } - - DEBUGP("try_to_recv=%u ", len); - udp_ep0_recv_data(pagebuf, len); - - DEBUGR(hexdump(pagebuf, len)); - - /* we can only access the write buffer with correctly aligned - * 32bit writes ! */ -#ifndef DEBUG_DFU_NOFLASH - DEBUGP("copying "); - for (i = 0; i < len/4; i++) { - *p++ = pagebuf32[i]; - /* If we have filled a page buffer, flash it */ - if (((unsigned long)p % AT91C_IFLASH_PAGE_SIZE) == 0) { - DEBUGP("page_full "); - flash_page(p-1); - } - } - ptr = (u_int8_t *) p; -#endif - - return RET_ZLP; -} - -#define AT91C_IFLASH_END ((u_int8_t *)AT91C_IFLASH + AT91C_IFLASH_SIZE) -static __dfufunc int handle_upload(u_int16_t val, u_int16_t len) -{ - DEBUGE("upload "); - if (len > AT91C_IFLASH_PAGE_SIZE) { - /* Too big */ - dfu_state = DFU_STATE_dfuERROR; - dfu_status = DFU_STATUS_errADDRESS; - udp_ep0_send_stall(); - return -EINVAL; - } - - if (ptr + len > AT91C_IFLASH_END) - len = AT91C_IFLASH_END - (u_int8_t *)ptr; - - udp_ep0_send_data((char *)ptr, len); - ptr+= len; - - return len; -} - -static __dfufunc void handle_getstatus(void) -{ - struct dfu_status dstat; - u_int32_t fsr = AT91F_MC_EFC_GetStatus(AT91C_BASE_MC); - - DEBUGE("getstatus(fsr=0x%08x) ", fsr); - - switch (dfu_state) { - case DFU_STATE_dfuDNLOAD_SYNC: - case DFU_STATE_dfuDNBUSY: - if (fsr & AT91C_MC_PROGE) { - DEBUGE("errPROG "); - dfu_status = DFU_STATUS_errPROG; - dfu_state = DFU_STATE_dfuERROR; - } else if (fsr & AT91C_MC_LOCKE) { - DEBUGE("errWRITE "); - dfu_status = DFU_STATUS_errWRITE; - dfu_state = DFU_STATE_dfuERROR; - } else if (fsr & AT91C_MC_FRDY) { - DEBUGE("DNLOAD_IDLE "); - dfu_state = DFU_STATE_dfuDNLOAD_IDLE; - } else { - DEBUGE("DNBUSY "); - dfu_state = DFU_STATE_dfuDNBUSY; - } - break; - case DFU_STATE_dfuMANIFEST_SYNC: - dfu_state = DFU_STATE_dfuMANIFEST; - break; - } - - /* send status response */ - dstat.bStatus = dfu_status; - dstat.bState = dfu_state; - dstat.iString = 0; - /* FIXME: set dstat.bwPollTimeout */ - - udp_ep0_send_data((char *)&dstat, sizeof(dstat)); -} - -static void __dfufunc handle_getstate(void) -{ - u_int8_t u8 = dfu_state; - DEBUGE("getstate "); - - udp_ep0_send_data((char *)&u8, sizeof(u8)); -} - -/* callback function for DFU requests */ -int __dfufunc dfu_ep0_handler(u_int8_t req_type, u_int8_t req, - u_int16_t val, u_int16_t len) -{ - int rc, ret = RET_NOTHING; - - DEBUGE("old_state = %u ", dfu_state); - - switch (dfu_state) { - case DFU_STATE_appIDLE: - switch (req) { - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - case USB_REQ_DFU_DETACH: - dfu_state = DFU_STATE_appDETACH; - ret = RET_ZLP; - goto out; - break; - default: - ret = RET_STALL; - } - break; - case DFU_STATE_appDETACH: - switch (req) { - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - default: - dfu_state = DFU_STATE_appIDLE; - ret = RET_STALL; - goto out; - break; - } - /* FIXME: implement timer to return to appIDLE */ - break; - case DFU_STATE_dfuIDLE: - switch (req) { - case USB_REQ_DFU_DNLOAD: - if (len == 0) { - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - goto out; - } - dfu_state = DFU_STATE_dfuDNLOAD_SYNC; - ptr = (u_int8_t *) AT91C_IFLASH + SAM7DFU_SIZE; - ret = handle_dnload(val, len); - break; - case USB_REQ_DFU_UPLOAD: - ptr = (u_int8_t *) AT91C_IFLASH + SAM7DFU_SIZE; - dfu_state = DFU_STATE_dfuUPLOAD_IDLE; - handle_upload(val, len); - break; - case USB_REQ_DFU_ABORT: - /* no zlp? */ - ret = RET_ZLP; - break; - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - default: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - goto out; - break; - } - break; - case DFU_STATE_dfuDNLOAD_SYNC: - switch (req) { - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - /* FIXME: state transition depending on block completeness */ - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - default: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - goto out; - } - break; - case DFU_STATE_dfuDNBUSY: - switch (req) { - case USB_REQ_DFU_GETSTATUS: - /* FIXME: only accept getstatus if bwPollTimeout - * has elapsed */ - handle_getstatus(); - break; - default: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - goto out; - } - break; - case DFU_STATE_dfuDNLOAD_IDLE: - switch (req) { - case USB_REQ_DFU_DNLOAD: - dfu_state = DFU_STATE_dfuDNLOAD_SYNC; - ret = handle_dnload(val, len); - break; - case USB_REQ_DFU_ABORT: - dfu_state = DFU_STATE_dfuIDLE; - ret = RET_ZLP; - break; - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - default: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - break; - } - break; - case DFU_STATE_dfuMANIFEST_SYNC: - switch (req) { - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - default: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - break; - } - break; - case DFU_STATE_dfuMANIFEST: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - break; - case DFU_STATE_dfuMANIFEST_WAIT_RST: - /* we should never go here */ - break; - case DFU_STATE_dfuUPLOAD_IDLE: - switch (req) { - case USB_REQ_DFU_UPLOAD: - /* state transition if less data then requested */ - rc = handle_upload(val, len); - if (rc >= 0 && rc < len) - dfu_state = DFU_STATE_dfuIDLE; - break; - case USB_REQ_DFU_ABORT: - dfu_state = DFU_STATE_dfuIDLE; - /* no zlp? */ - ret = RET_ZLP; - break; - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - default: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - break; - } - break; - case DFU_STATE_dfuERROR: - switch (req) { - case USB_REQ_DFU_GETSTATUS: - handle_getstatus(); - break; - case USB_REQ_DFU_GETSTATE: - handle_getstate(); - break; - case USB_REQ_DFU_CLRSTATUS: - dfu_state = DFU_STATE_dfuIDLE; - dfu_status = DFU_STATUS_OK; - /* no zlp? */ - ret = RET_ZLP; - break; - default: - dfu_state = DFU_STATE_dfuERROR; - ret = RET_STALL; - break; - } - break; - } - -out: - DEBUGE("new_state = %u\r\n", dfu_state); - - switch (ret) { - case RET_NOTHING: - break; - case RET_ZLP: - udp_ep0_send_zlp(); - break; - case RET_STALL: - udp_ep0_send_stall(); - break; - } - return 0; -} - -static u_int8_t cur_config; - -/* USB DFU Device descriptor in DFU mode */ -__dfustruct const struct usb_device_descriptor dfu_dev_descriptor = { - .bLength = USB_DT_DEVICE_SIZE, - .bDescriptorType = USB_DT_DEVICE, - .bcdUSB = 0x0100, - .bDeviceClass = 0x00, - .bDeviceSubClass = 0x00, - .bDeviceProtocol = 0x00, - .bMaxPacketSize0 = 8, - .idVendor = USB_VENDOR_ID, - .idProduct = USB_PRODUCT_ID, - .bcdDevice = 0x0000, - .iManufacturer = 1, - .iProduct = 2, - .iSerialNumber = 0x00, - .bNumConfigurations = 0x01, -}; - -/* USB DFU Config descriptor in DFU mode */ -__dfustruct const struct _dfu_desc dfu_cfg_descriptor = { - .ucfg = { - .bLength = USB_DT_CONFIG_SIZE, - .bDescriptorType = USB_DT_CONFIG, - .wTotalLength = USB_DT_CONFIG_SIZE + - 2* USB_DT_INTERFACE_SIZE + - USB_DT_DFU_SIZE, - .bNumInterfaces = 1, - .bConfigurationValue = 1, -#ifdef CONFIG_USB_STRING - .iConfiguration = 3, -#else - .iConfiguration = 0, -#endif - .bmAttributes = USB_CONFIG_ATT_ONE, - .bMaxPower = 100, - }, - .uif[0] = { - .bLength = USB_DT_INTERFACE_SIZE, - .bDescriptorType = USB_DT_INTERFACE, - .bInterfaceNumber = 0x00, - .bAlternateSetting = 0x00, - .bNumEndpoints = 0x00, - .bInterfaceClass = 0xfe, - .bInterfaceSubClass = 0x01, - .bInterfaceProtocol = 0x02, -#ifdef CONFIG_USB_STRING - .iInterface = 4, -#else - .iInterface = 0, -#endif - }, - .uif[1] = { - .bLength = USB_DT_INTERFACE_SIZE, - .bDescriptorType = USB_DT_INTERFACE, - .bInterfaceNumber = 0x00, - .bAlternateSetting = 0x01, - .bNumEndpoints = 0x00, - .bInterfaceClass = 0xfe, - .bInterfaceSubClass = 0x01, - .bInterfaceProtocol = 0x02, -#ifdef CONFIG_USB_STRING - .iInterface = 5, -#else - .iInterface = 0, -#endif - }, - - .func_dfu = DFU_FUNC_DESC, -}; - - -/* minimal USB EP0 handler in DFU mode */ -static __dfufunc void dfu_udp_ep0_handler(void) -{ - AT91PS_UDP pUDP = AT91C_BASE_UDP; - u_int8_t bmRequestType, bRequest; - u_int16_t wValue, wIndex, wLength, wStatus; - u_int32_t csr = pUDP->UDP_CSR[0]; - - DEBUGE("CSR=0x%04x ", csr); - - if (csr & AT91C_UDP_STALLSENT) { - DEBUGE("ACK_STALLSENT "); - pUDP->UDP_CSR[0] = ~AT91C_UDP_STALLSENT; - } - - if (csr & AT91C_UDP_RX_DATA_BK0) { - DEBUGE("ACK_BANK0 "); - pUDP->UDP_CSR[0] &= ~AT91C_UDP_RX_DATA_BK0; - } - - if (!(csr & AT91C_UDP_RXSETUP)) { - DEBUGE("no setup packet\r\n"); - return; - } - - DEBUGE("len=%d ", csr >> 16); - if (csr >> 16 == 0) { - DEBUGE("empty packet\r\n"); - return; - } - - bmRequestType = pUDP->UDP_FDR[0]; - bRequest = pUDP->UDP_FDR[0]; - wValue = (pUDP->UDP_FDR[0] & 0xFF); - wValue |= (pUDP->UDP_FDR[0] << 8); - wIndex = (pUDP->UDP_FDR[0] & 0xFF); - wIndex |= (pUDP->UDP_FDR[0] << 8); - wLength = (pUDP->UDP_FDR[0] & 0xFF); - wLength |= (pUDP->UDP_FDR[0] << 8); - - DEBUGE("bmRequestType=0x%2x ", bmRequestType); - - if (bmRequestType & 0x80) { - DEBUGE("DATA_IN=1 "); - pUDP->UDP_CSR[0] |= AT91C_UDP_DIR; - while (!(pUDP->UDP_CSR[0] & AT91C_UDP_DIR)) ; - } - pUDP->UDP_CSR[0] &= ~AT91C_UDP_RXSETUP; - while ((pUDP->UDP_CSR[0] & AT91C_UDP_RXSETUP)) ; - - /* Handle supported standard device request Cf Table 9-3 in USB - * speciication Rev 1.1 */ - switch ((bRequest << 8) | bmRequestType) { - u_int8_t desc_type, desc_index; - case STD_GET_DESCRIPTOR: - DEBUGE("GET_DESCRIPTOR "); - desc_type = wValue >> 8; - desc_index = wValue & 0xff; - switch (desc_type) { - case USB_DT_DEVICE: - /* Return Device Descriptor */ - udp_ep0_send_data((const char *) - &dfu_dev_descriptor, - MIN(sizeof(dfu_dev_descriptor), - wLength)); - break; - case USB_DT_CONFIG: - /* Return Configuration Descriptor */ - udp_ep0_send_data((const char *) - &dfu_cfg_descriptor, - MIN(sizeof(dfu_cfg_descriptor), - wLength)); - break; - case USB_DT_STRING: - /* Return String Descriptor */ - if (desc_index > ARRAY_SIZE(usb_strings)) { - udp_ep0_send_stall(); - break; - } - DEBUGE("bLength=%u, wLength=%u ", - usb_strings[desc_index]->bLength, wLength); - udp_ep0_send_data((const char *) usb_strings[desc_index], - MIN(usb_strings[desc_index]->bLength, - wLength)); - break; - case USB_DT_CS_DEVICE: - /* Return Function descriptor */ - udp_ep0_send_data((const char *) &dfu_cfg_descriptor.func_dfu, - MIN(sizeof(dfu_cfg_descriptor.func_dfu), - wLength)); - break; - default: - udp_ep0_send_stall(); - break; - } - break; - case STD_SET_ADDRESS: - DEBUGE("SET_ADDRESS "); - udp_ep0_send_zlp(); - pUDP->UDP_FADDR = (AT91C_UDP_FEN | wValue); - pUDP->UDP_GLBSTATE = (wValue) ? AT91C_UDP_FADDEN : 0; - break; - case STD_SET_CONFIGURATION: - DEBUGE("SET_CONFIG "); - if (wValue) - DEBUGE("VALUE!=0 "); - cur_config = wValue; - udp_ep0_send_zlp(); - pUDP->UDP_GLBSTATE = - (wValue) ? AT91C_UDP_CONFG : AT91C_UDP_FADDEN; - pUDP->UDP_CSR[1] = - (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT) : - 0; - pUDP->UDP_CSR[2] = - (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_IN) : 0; - pUDP->UDP_CSR[3] = - (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN) : 0; - pUDP->UDP_IER = (AT91C_UDP_EPINT0|AT91C_UDP_EPINT1| - AT91C_UDP_EPINT2|AT91C_UDP_EPINT3); - break; - case STD_GET_CONFIGURATION: - DEBUGE("GET_CONFIG "); - udp_ep0_send_data((char *)&(cur_config), - sizeof(cur_config)); - break; - case STD_GET_STATUS_ZERO: - DEBUGE("GET_STATUS_ZERO "); - wStatus = 0; - udp_ep0_send_data((char *)&wStatus, sizeof(wStatus)); - break; - case STD_GET_STATUS_INTERFACE: - DEBUGE("GET_STATUS_INTERFACE "); - wStatus = 0; - udp_ep0_send_data((char *)&wStatus, sizeof(wStatus)); - break; - case STD_GET_STATUS_ENDPOINT: - DEBUGE("GET_STATUS_ENDPOINT(EPidx=%u) ", wIndex&0x0f); - wStatus = 0; - wIndex &= 0x0F; - if ((pUDP->UDP_GLBSTATE & AT91C_UDP_CONFG) && (wIndex == 0)) { - wStatus = - (pUDP->UDP_CSR[wIndex] & AT91C_UDP_EPEDS) ? 0 : 1; - udp_ep0_send_data((char *)&wStatus, - sizeof(wStatus)); - } else if ((pUDP->UDP_GLBSTATE & AT91C_UDP_FADDEN) - && (wIndex == 0)) { - wStatus = - (pUDP->UDP_CSR[wIndex] & AT91C_UDP_EPEDS) ? 0 : 1; - udp_ep0_send_data((char *)&wStatus, - sizeof(wStatus)); - } else - udp_ep0_send_stall(); - break; - case STD_SET_FEATURE_ZERO: - DEBUGE("SET_FEATURE_ZERO "); - udp_ep0_send_stall(); - break; - case STD_SET_FEATURE_INTERFACE: - DEBUGE("SET_FEATURE_INTERFACE "); - udp_ep0_send_zlp(); - break; - case STD_SET_FEATURE_ENDPOINT: - DEBUGE("SET_FEATURE_ENDPOINT "); - udp_ep0_send_stall(); - break; - case STD_CLEAR_FEATURE_ZERO: - DEBUGE("CLEAR_FEATURE_ZERO "); - udp_ep0_send_stall(); - break; - case STD_CLEAR_FEATURE_INTERFACE: - DEBUGE("CLEAR_FEATURE_INTERFACE "); - udp_ep0_send_zlp(); - break; - case STD_CLEAR_FEATURE_ENDPOINT: - DEBUGE("CLEAR_FEATURE_ENDPOINT(EPidx=%u) ", wIndex & 0x0f); - udp_ep0_send_stall(); - break; - case STD_SET_INTERFACE: - DEBUGE("SET INTERFACE "); - /* FIXME: store the interface number somewhere, once - * we need to support DFU flashing DFU */ - udp_ep0_send_zlp(); - break; - default: - DEBUGE("DEFAULT(req=0x%02x, type=0x%02x) ", - bRequest, bmRequestType); - if ((bmRequestType & 0x3f) == USB_TYPE_DFU) { - dfu_ep0_handler(bmRequestType, bRequest, - wValue, wLength); - } else - udp_ep0_send_stall(); - break; - } - DEBUGE("\r\n"); -} - -/* minimal USB IRQ handler in DFU mode */ -static __dfufunc void dfu_udp_irq(void) -{ - AT91PS_UDP pUDP = AT91C_BASE_UDP; - AT91_REG isr = pUDP->UDP_ISR; - led1on(); - - if (isr & AT91C_UDP_ENDBUSRES) { - led2on(); - pUDP->UDP_IER = AT91C_UDP_EPINT0; - /* reset all endpoints */ - pUDP->UDP_RSTEP = (unsigned int)-1; - pUDP->UDP_RSTEP = 0; - /* Enable the function */ - pUDP->UDP_FADDR = AT91C_UDP_FEN; - /* Configure endpoint 0 */ - pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL); - cur_config = 0; - - if (dfu_state == DFU_STATE_dfuMANIFEST_WAIT_RST || - dfu_state == DFU_STATE_dfuMANIFEST) { - AT91F_RSTSoftReset(AT91C_BASE_RSTC, AT91C_RSTC_PROCRST| - AT91C_RSTC_PERRST| - AT91C_RSTC_EXTRST); - } - - } - - if (isr & AT91C_UDP_EPINT0) - dfu_udp_ep0_handler(); - - /* clear all interrupts */ - pUDP->UDP_ICR = isr; - - AT91F_AIC_ClearIt(AT91C_ID_UDP); - - led1off(); -} - -/* this is only called once before DFU mode, no __dfufunc required */ -static void dfu_switch(void) -{ - AT91PS_AIC pAic = AT91C_BASE_AIC; - - DEBUGE("\r\nsam7dfu: switching to DFU mode\r\n"); - - dfu_state = DFU_STATE_appDETACH; - AT91F_RSTSoftReset(AT91C_BASE_RSTC, AT91C_RSTC_PROCRST| - AT91C_RSTC_PERRST|AT91C_RSTC_EXTRST); - - /* We should never reach here, but anyway avoid returning to the - * caller since he doesn't expect us to do so */ - while (1) ; -} - -void __dfufunc dfu_main(void) -{ - AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OPENPCD_PIO_LED1); - AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OPENPCD_PIO_LED2); - led1off(); - led2off(); - - AT91F_DBGU_Init(); - AT91F_DBGU_Printk("\n\r\n\rsam7dfu - AT91SAM7 USB DFU bootloader\n\r" - "(C) 2006 by Harald Welte <hwelte@hmw-consulting.de>\n\r" - "This software is FREE SOFTWARE licensed under GNU GPL\n\r"); - AT91F_DBGU_Printk("Version " COMPILE_SVNREV - " compiled " COMPILE_DATE - " by " COMPILE_BY "\n\r\n\r"); - - udp_init(); - - dfu_state = DFU_STATE_dfuIDLE; - - /* This implements - AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_UDP, - OPENPCD_IRQ_PRIO_UDP, - AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, dfu_udp_irq); - */ - AT91PS_AIC pAic = AT91C_BASE_AIC; - pAic->AIC_IDCR = 1 << AT91C_ID_UDP; - pAic->AIC_SVR[AT91C_ID_UDP] = (unsigned int) &dfu_udp_irq; - pAic->AIC_SMR[AT91C_ID_UDP] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | - OPENPCD_IRQ_PRIO_UDP; - pAic->AIC_ICCR = 1 << AT91C_ID_UDP; - - AT91F_AIC_EnableIt(AT91C_ID_UDP); - - /* End-of-Bus-Reset is always enabled */ - - /* Clear for set the Pull up resistor */ -#if defined(PCD) - AT91F_PIO_SetOutput(AT91C_BASE_PIOA, OPENPCD_PIO_UDP_PUP); -#endif - AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, OPENPCD_PIO_UDP_PUPv4); - - flash_init(); - - AT91F_DBGU_Printk("You may now start the DFU up/download process\r\n"); - /* do nothing, since all of DFU is interrupt driven */ - int i = 0; - while (1) { - /* Occasionally reset watchdog */ - i = (i+1) % 10000; - if( i== 0) { - AT91F_WDTRestart(AT91C_BASE_WDTC); - } - } -} - -const struct dfuapi __dfufunctab dfu_api = { - .udp_init = &udp_init, - .ep0_send_data = &udp_ep0_send_data, - .ep0_send_zlp = &udp_ep0_send_zlp, - .ep0_send_stall = &udp_ep0_send_stall, - .dfu_ep0_handler = &dfu_ep0_handler, - .dfu_switch = &dfu_switch, - .dfu_state = &dfu_state, - .dfu_dev_descriptor = &dfu_dev_descriptor, - .dfu_cfg_descriptor = &dfu_cfg_descriptor, -}; - -/* just for testing */ -int foo = 12345; diff --git a/openpicc/dfu/dfu.h b/openpicc/dfu/dfu.h deleted file mode 100644 index 77f80a1..0000000 --- a/openpicc/dfu/dfu.h +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef _DFU_H -#define _DFU_H - -/* USB Device Firmware Update Implementation for OpenPCD - * (C) 2006 by Harald Welte <hwelte@hmw-consulting.de> - * - * This ought to be compliant to the USB DFU Spec 1.0 as available from - * http://www.usb.org/developers/devclass_docs/usbdfu10.pdf - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - */ - -#include <sys/types.h> -#include <usb_ch9.h> -#include <usb_dfu.h> - -/* USB DFU functional descriptor */ -#define DFU_FUNC_DESC { \ - .bLength = USB_DT_DFU_SIZE, \ - .bDescriptorType = USB_DT_DFU, \ - .bmAttributes = USB_DFU_CAN_UPLOAD | USB_DFU_CAN_DOWNLOAD, \ - .wDetachTimeOut = 0xff00, \ - .wTransferSize = AT91C_IFLASH_PAGE_SIZE, \ - .bcdDFUVersion = 0x0100, \ -} - -/* USB Interface descriptor in Runtime mode */ -#ifdef CONFIG_USB_STRING -#define DFU_RT_IF_DESC { \ - { \ - .bLength = USB_DT_INTERFACE_SIZE, \ - .bDescriptorType = USB_DT_INTERFACE, \ - .bInterfaceNumber = 0x01, \ - .bAlternateSetting = 0x00, \ - .bNumEndpoints = 0x00, \ - .bInterfaceClass = 0xfe, \ - .bInterfaceSubClass = 0x01, \ - .bInterfaceProtocol = 0x01, \ - .iInterface = 1, \ - }, { \ - .bLength = USB_DT_INTERFACE_SIZE, \ - .bDescriptorType = USB_DT_INTERFACE, \ - .bInterfaceNumber = 0x02, \ - .bAlternateSetting = 0x00, \ - .bNumEndpoints = 0x00, \ - .bInterfaceClass = 0xfe, \ - .bInterfaceSubClass = 0x01, \ - .bInterfaceProtocol = 0x01, \ - .iInterface = 2, \ - }, \ -} -#else -#define DFU_RT_IF_DESC { \ - { \ - .bLength = USB_DT_INTERFACE_SIZE, \ - .bDescriptorType = USB_DT_INTERFACE, \ - .bInterfaceNumber = 0x01, \ - .bAlternateSetting = 0x00, \ - .bNumEndpoints = 0x00, \ - .bInterfaceClass = 0xfe, \ - .bInterfaceSubClass = 0x01, \ - .bInterfaceProtocol = 0x01, \ - .iInterface = 0, \ - }, { \ - .bLength = USB_DT_INTERFACE_SIZE, \ - .bDescriptorType = USB_DT_INTERFACE, \ - .bInterfaceNumber = 0x02, \ - .bAlternateSetting = 0x00, \ - .bNumEndpoints = 0x00, \ - .bInterfaceClass = 0xfe, \ - .bInterfaceSubClass = 0x01, \ - .bInterfaceProtocol = 0x01, \ - .iInterface = 0, \ - }, \ -} -#endif - -#define __dfufunctab __attribute__ ((section (".dfu.functab"))) -#define __dfudata __attribute__ ((section (".data.shared"))) -#define __dfufunc -#define __dfustruct const - -#define DFU_API_LOCATION ((const struct dfuapi *) 0x00103fd0) - -struct _dfu_desc { - struct usb_config_descriptor ucfg; - struct usb_interface_descriptor uif[2]; - struct usb_dfu_func_descriptor func_dfu; -}; - -struct dfuapi { - void (*udp_init)(void); - void (*ep0_send_data)(const char *data, u_int32_t len); - void (*ep0_send_zlp)(void); - void (*ep0_send_stall)(void); - int (*dfu_ep0_handler)(u_int8_t req_type, u_int8_t req, - u_int16_t val, u_int16_t len); - void (*dfu_switch)(void); - u_int32_t *dfu_state; - const struct usb_device_descriptor *dfu_dev_descriptor; - const struct _dfu_desc *dfu_cfg_descriptor; -}; - -/* From openpcd/firmware/src/os/pcd_enumerate.h */ -/* USB standard request code */ - -#define STD_GET_STATUS_ZERO 0x0080 -#define STD_GET_STATUS_INTERFACE 0x0081 -#define STD_GET_STATUS_ENDPOINT 0x0082 - -#define STD_CLEAR_FEATURE_ZERO 0x0100 -#define STD_CLEAR_FEATURE_INTERFACE 0x0101 -#define STD_CLEAR_FEATURE_ENDPOINT 0x0102 - -#define STD_SET_FEATURE_ZERO 0x0300 -#define STD_SET_FEATURE_INTERFACE 0x0301 -#define STD_SET_FEATURE_ENDPOINT 0x0302 - -#define STD_SET_ADDRESS 0x0500 -#define STD_GET_DESCRIPTOR 0x0680 -#define STD_SET_DESCRIPTOR 0x0700 -#define STD_GET_CONFIGURATION 0x0880 -#define STD_SET_CONFIGURATION 0x0900 -#define STD_GET_INTERFACE 0x0A81 -#define STD_SET_INTERFACE 0x0B01 -#define STD_SYNCH_FRAME 0x0C82 - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#endif /* _DFU_H */ diff --git a/openpicc/dfu/usb_strings_dfu.h b/openpicc/dfu/usb_strings_dfu.h deleted file mode 100644 index 24fde2f..0000000 --- a/openpicc/dfu/usb_strings_dfu.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef _USB_STRINGS_H -#define _USB_STRINGS_H - -/* THIS FILE IS AUTOGENERATED, DO NOT MODIFY MANUALLY */ - -#include <usb_ch9.h> -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - -static const struct { - struct usb_descriptor_header hdr; - u_int16_t wData[]; -} __attribute__((packed)) string0 = { - .hdr = { - .bLength = sizeof(struct usb_descriptor_header) + 1 * sizeof(u_int16_t), - .bDescriptorType = USB_DT_STRING, - }, - .wData = {0x0409 /* English */ }, -}; - -/* String 1 "bitmanufaktur.de IT Solutions and hmw-consulting.de" */ -static const struct { - struct usb_descriptor_header hdr; - u_int16_t wData[]; -} __attribute__((packed)) string1 = { - .hdr = { - .bLength = sizeof(struct usb_descriptor_header) + 51 * sizeof(u_int16_t), - .bDescriptorType = USB_DT_STRING, - }, - .wData = { 0x0062, 0x0069, 0x0074, 0x006d, 0x0061, 0x006e, - 0x0075, 0x0066, 0x0061, 0x006b, 0x0074, 0x0075, - 0x0072, 0x002e, 0x0064, 0x0065, 0x0020, 0x0049, - 0x0054, 0x0020, 0x0053, 0x006f, 0x006c, 0x0075, - 0x0074, 0x0069, 0x006f, 0x006e, 0x0073, 0x0020, - 0x0061, 0x006e, 0x0064, 0x0020, 0x0068, 0x006d, - 0x0077, 0x002d, 0x0063, 0x006f, 0x006e, 0x0073, - 0x0075, 0x006c, 0x0074, 0x0069, 0x006e, 0x0067, - 0x002e, 0x0064, 0x0065, }, -}; - -/* String 2 "OpenPICC RFID Simulator - DFU Mode" */ -static const struct { - struct usb_descriptor_header hdr; - u_int16_t wData[]; -} __attribute__((packed)) string2 = { - .hdr = { - .bLength = sizeof(struct usb_descriptor_header) + 34 * sizeof(u_int16_t), - .bDescriptorType = USB_DT_STRING, - }, - .wData = { 0x004f, 0x0070, 0x0065, 0x006e, 0x0050, 0x0049, - 0x0043, 0x0043, 0x0020, 0x0052, 0x0046, 0x0049, - 0x0044, 0x0020, 0x0053, 0x0069, 0x006d, 0x0075, - 0x006c, 0x0061, 0x0074, 0x006f, 0x0072, 0x0020, - 0x002d, 0x0020, 0x0044, 0x0046, 0x0055, 0x0020, - 0x004d, 0x006f, 0x0064, 0x0065, }, -}; - -/* String 3 "OpenPIIC DFU Configuration" */ -static const struct { - struct usb_descriptor_header hdr; - u_int16_t wData[]; -} __attribute__((packed)) string3 = { - .hdr = { - .bLength = sizeof(struct usb_descriptor_header) + 26 * sizeof(u_int16_t), - .bDescriptorType = USB_DT_STRING, - }, - .wData = { 0x004f, 0x0070, 0x0065, 0x006e, 0x0050, 0x0049, - 0x0049, 0x0043, 0x0020, 0x0044, 0x0046, 0x0055, - 0x0020, 0x0043, 0x006f, 0x006e, 0x0066, 0x0069, - 0x0067, 0x0075, 0x0072, 0x0061, 0x0074, 0x0069, - 0x006f, 0x006e, }, -}; - -/* String 4 "OpenPICC DFU Interface - Application Partition" */ -static const struct { - struct usb_descriptor_header hdr; - u_int16_t wData[]; -} __attribute__((packed)) string4 = { - .hdr = { - .bLength = sizeof(struct usb_descriptor_header) + 46 * sizeof(u_int16_t), - .bDescriptorType = USB_DT_STRING, - }, - .wData = { 0x004f, 0x0070, 0x0065, 0x006e, 0x0050, 0x0049, - 0x0043, 0x0043, 0x0020, 0x0044, 0x0046, 0x0055, - 0x0020, 0x0049, 0x006e, 0x0074, 0x0065, 0x0072, - 0x0066, 0x0061, 0x0063, 0x0065, 0x0020, 0x002d, - 0x0020, 0x0041, 0x0070, 0x0070, 0x006c, 0x0069, - 0x0063, 0x0061, 0x0074, 0x0069, 0x006f, 0x006e, - 0x0020, 0x0050, 0x0061, 0x0072, 0x0074, 0x0069, - 0x0074, 0x0069, 0x006f, 0x006e, }, -}; - -/* String 5 "OpenPICC DFU Interface - Bootloader Partition" */ -static const struct { - struct usb_descriptor_header hdr; - u_int16_t wData[]; -} __attribute__((packed)) string5 = { - .hdr = { - .bLength = sizeof(struct usb_descriptor_header) + 45 * sizeof(u_int16_t), - .bDescriptorType = USB_DT_STRING, - }, - .wData = { 0x004f, 0x0070, 0x0065, 0x006e, 0x0050, 0x0049, - 0x0043, 0x0043, 0x0020, 0x0044, 0x0046, 0x0055, - 0x0020, 0x0049, 0x006e, 0x0074, 0x0065, 0x0072, - 0x0066, 0x0061, 0x0063, 0x0065, 0x0020, 0x002d, - 0x0020, 0x0042, 0x006f, 0x006f, 0x0074, 0x006c, - 0x006f, 0x0061, 0x0064, 0x0065, 0x0072, 0x0020, - 0x0050, 0x0061, 0x0072, 0x0074, 0x0069, 0x0074, - 0x0069, 0x006f, 0x006e, }, -}; - -static const struct usb_descriptor_header *usb_strings[] = { - (struct usb_descriptor_header *) &string0, - (struct usb_descriptor_header *) &string1, - (struct usb_descriptor_header *) &string2, - (struct usb_descriptor_header *) &string3, - (struct usb_descriptor_header *) &string4, - (struct usb_descriptor_header *) &string5, -}; - -#endif /* _USB_STRINGS_H */ diff --git a/openpicc/dfu/usb_strings_dfu.txt b/openpicc/dfu/usb_strings_dfu.txt deleted file mode 100644 index 681c30a..0000000 --- a/openpicc/dfu/usb_strings_dfu.txt +++ /dev/null @@ -1,5 +0,0 @@ -bitmanufaktur.de IT Solutions and hmw-consulting.de -OpenPICC RFID Simulator - DFU Mode -OpenPIIC DFU Configuration -OpenPICC DFU Interface - Application Partition -OpenPICC DFU Interface - Bootloader Partition diff --git a/openpicc/include/compile.h b/openpicc/include/compile.h deleted file mode 100644 index 14ec5dd..0000000 --- a/openpicc/include/compile.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _COMPILE_H -#define _COMPILE_H - -/* This file is auto generated */ -#define COMPILE_DATE "20071107-171917" -#define COMPILE_BY "henryk@dawn.ploetzli.ch" -#define COMPILE_SVNREV "313-unclean" - -#endif /* _COMPILE_H */ diff --git a/openpicc/include/usb_ch9.h b/openpicc/include/usb_ch9.h deleted file mode 100644 index 46066f2..0000000 --- a/openpicc/include/usb_ch9.h +++ /dev/null @@ -1,550 +0,0 @@ -/* - * This file holds USB constants and structures that are needed for USB - * device APIs. These are used by the USB device model, which is defined - * in chapter 9 of the USB 2.0 specification. Linux has several APIs in C - * that need these: - * - * - the master/host side Linux-USB kernel driver API; - * - the "usbfs" user space API; and - * - the Linux "gadget" slave/device/peripheral side driver API. - * - * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems - * act either as a USB master/host or as a USB slave/device. That means - * the master and slave side APIs benefit from working well together. - * - * There's also "Wireless USB", using low power short range radios for - * peripheral interconnection but otherwise building on the USB framework. - */ - -#ifndef __LINUX_USB_CH9_H -#define __LINUX_USB_CH9_H - -#include <sys/types.h> - -/*-------------------------------------------------------------------------*/ - -/* CONTROL REQUEST SUPPORT */ - -/* - * USB directions - * - * This bit flag is used in endpoint descriptors' bEndpointAddress field. - * It's also one of three fields in control requests bRequestType. - */ -#define USB_DIR_OUT 0 /* to device */ -#define USB_DIR_IN 0x80 /* to host */ - -/* - * USB types, the second of three bRequestType fields - */ -#define USB_TYPE_MASK (0x03 << 5) -#define USB_TYPE_STANDARD (0x00 << 5) -#define USB_TYPE_CLASS (0x01 << 5) -#define USB_TYPE_VENDOR (0x02 << 5) -#define USB_TYPE_RESERVED (0x03 << 5) - -/* - * USB recipients, the third of three bRequestType fields - */ -#define USB_RECIP_MASK 0x1f -#define USB_RECIP_DEVICE 0x00 -#define USB_RECIP_INTERFACE 0x01 -#define USB_RECIP_ENDPOINT 0x02 -#define USB_RECIP_OTHER 0x03 - -/* - * Standard requests, for the bRequest field of a SETUP packet. - * - * These are qualified by the bRequestType field, so that for example - * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved - * by a GET_STATUS request. - */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -#define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */ -#define USB_REQ_GET_ENCRYPTION 0x0E -#define USB_REQ_SET_HANDSHAKE 0x0F -#define USB_REQ_GET_HANDSHAKE 0x10 -#define USB_REQ_SET_CONNECTION 0x11 -#define USB_REQ_SET_SECURITY_DATA 0x12 -#define USB_REQ_GET_SECURITY_DATA 0x13 -#define USB_REQ_SET_WUSB_DATA 0x14 -#define USB_REQ_LOOPBACK_DATA_WRITE 0x15 -#define USB_REQ_LOOPBACK_DATA_READ 0x16 -#define USB_REQ_SET_INTERFACE_DS 0x17 - -/* - * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and - * are read as a bit array returned by USB_REQ_GET_STATUS. (So there - * are at most sixteen features of each type.) - */ -#define USB_DEVICE_SELF_POWERED 0 /* (read only) */ -#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ -#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ -#define USB_DEVICE_BATTERY 2 /* (wireless) */ -#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ -#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ -#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ -#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ -#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ - -#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ - - -/** - * struct usb_ctrlrequest - SETUP data for a USB device control request - * @bRequestType: matches the USB bmRequestType field - * @bRequest: matches the USB bRequest field - * @wValue: matches the USB wValue field (le16 byte order) - * @wIndex: matches the USB wIndex field (le16 byte order) - * @wLength: matches the USB wLength field (le16 byte order) - * - * This structure is used to send control requests to a USB device. It matches - * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the - * USB spec for a fuller description of the different fields, and what they are - * used for. - * - * Note that the driver for any interface can issue control requests. - * For most devices, interfaces don't coordinate with each other, so - * such requests may be made at any time. - */ -struct usb_ctrlrequest { - u_int8_t bRequestType; - u_int8_t bRequest; - u_int16_t wValue; - u_int16_t wIndex; - u_int16_t wLength; -} __attribute__ ((packed)); - -/*-------------------------------------------------------------------------*/ - -/* - * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or - * (rarely) accepted by SET_DESCRIPTOR. - * - * Note that all multi-byte values here are encoded in little endian - * byte order "on the wire". But when exposed through Linux-USB APIs, - * they've been converted to cpu byte order. - */ - -/* - * Descriptor types ... USB 2.0 spec table 9.5 - */ -#define USB_DT_DEVICE 0x01 -#define USB_DT_CONFIG 0x02 -#define USB_DT_STRING 0x03 -#define USB_DT_INTERFACE 0x04 -#define USB_DT_ENDPOINT 0x05 -#define USB_DT_DEVICE_QUALIFIER 0x06 -#define USB_DT_OTHER_SPEED_CONFIG 0x07 -#define USB_DT_INTERFACE_POWER 0x08 -/* these are from a minor usb 2.0 revision (ECN) */ -#define USB_DT_OTG 0x09 -#define USB_DT_DEBUG 0x0a -#define USB_DT_INTERFACE_ASSOCIATION 0x0b -/* these are from the Wireless USB spec */ -#define USB_DT_SECURITY 0x0c -#define USB_DT_KEY 0x0d -#define USB_DT_ENCRYPTION_TYPE 0x0e -#define USB_DT_BOS 0x0f -#define USB_DT_DEVICE_CAPABILITY 0x10 -#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11 - -/* conventional codes for class-specific descriptors */ -#define USB_DT_CS_DEVICE 0x21 -#define USB_DT_CS_CONFIG 0x22 -#define USB_DT_CS_STRING 0x23 -#define USB_DT_CS_INTERFACE 0x24 -#define USB_DT_CS_ENDPOINT 0x25 - -/* All standard descriptors have these 2 fields at the beginning */ -struct usb_descriptor_header { - u_int8_t bLength; - u_int8_t bDescriptorType; -} __attribute__ ((packed)); - - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_DEVICE: Device descriptor */ -struct usb_device_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int16_t bcdUSB; - u_int8_t bDeviceClass; - u_int8_t bDeviceSubClass; - u_int8_t bDeviceProtocol; - u_int8_t bMaxPacketSize0; - u_int16_t idVendor; - u_int16_t idProduct; - u_int16_t bcdDevice; - u_int8_t iManufacturer; - u_int8_t iProduct; - u_int8_t iSerialNumber; - u_int8_t bNumConfigurations; -} __attribute__ ((packed)); - -#define USB_DT_DEVICE_SIZE 18 - - -/* - * Device and/or Interface Class codes - * as found in bDeviceClass or bInterfaceClass - * and defined by www.usb.org documents - */ -#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ -#define USB_CLASS_AUDIO 1 -#define USB_CLASS_COMM 2 -#define USB_CLASS_HID 3 -#define USB_CLASS_PHYSICAL 5 -#define USB_CLASS_STILL_IMAGE 6 -#define USB_CLASS_PRINTER 7 -#define USB_CLASS_MASS_STORAGE 8 -#define USB_CLASS_HUB 9 -#define USB_CLASS_CDC_DATA 0x0a -#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ -#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ -#define USB_CLASS_VIDEO 0x0e -#define USB_CLASS_WIRELESS_CONTROLLER 0xe0 -#define USB_CLASS_APP_SPEC 0xfe -#define USB_CLASS_VENDOR_SPEC 0xff - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_CONFIG: Configuration descriptor information. - * - * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the - * descriptor type is different. Highspeed-capable devices can look - * different depending on what speed they're currently running. Only - * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG - * descriptors. - */ -struct usb_config_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int16_t wTotalLength; - u_int8_t bNumInterfaces; - u_int8_t bConfigurationValue; - u_int8_t iConfiguration; - u_int8_t bmAttributes; - u_int8_t bMaxPower; -} __attribute__ ((packed)); - -#define USB_DT_CONFIG_SIZE 9 - -/* from config descriptor bmAttributes */ -#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ -#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ -#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ -#define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */ - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_STRING: String descriptor */ -struct usb_string_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int16_t wData[0]; /* UTF-16LE encoded */ -} __attribute__ ((packed)); - -/* note that "string" zero is special, it holds language codes that - * the device supports, not Unicode characters. - */ - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_INTERFACE: Interface descriptor */ -struct usb_interface_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int8_t bInterfaceNumber; - u_int8_t bAlternateSetting; - u_int8_t bNumEndpoints; - u_int8_t bInterfaceClass; - u_int8_t bInterfaceSubClass; - u_int8_t bInterfaceProtocol; - u_int8_t iInterface; -} __attribute__ ((packed)); - -#define USB_DT_INTERFACE_SIZE 9 - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_ENDPOINT: Endpoint descriptor */ -struct usb_endpoint_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int8_t bEndpointAddress; - u_int8_t bmAttributes; - u_int16_t wMaxPacketSize; - u_int8_t bInterval; -} __attribute__ ((packed)); - -#define USB_DT_ENDPOINT_SIZE 7 -#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ - - -/* - * Endpoints - */ -#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ -#define USB_ENDPOINT_DIR_MASK 0x80 - -#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ -#define USB_ENDPOINT_XFER_CONTROL 0 -#define USB_ENDPOINT_XFER_ISOC 1 -#define USB_ENDPOINT_XFER_BULK 2 -#define USB_ENDPOINT_XFER_INT 3 -#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 - - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ -struct usb_qualifier_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int16_t bcdUSB; - u_int8_t bDeviceClass; - u_int8_t bDeviceSubClass; - u_int8_t bDeviceProtocol; - u_int8_t bMaxPacketSize0; - u_int8_t bNumConfigurations; - u_int8_t bRESERVED; -} __attribute__ ((packed)); - - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_OTG (from OTG 1.0a supplement) */ -struct usb_otg_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int8_t bmAttributes; /* support for HNP, SRP, etc */ -} __attribute__ ((packed)); - -/* from usb_otg_descriptor.bmAttributes */ -#define USB_OTG_SRP (1 << 0) -#define USB_OTG_HNP (1 << 1) /* swap host/device roles */ - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_DEBUG: for special highspeed devices, replacing serial console */ -struct usb_debug_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - /* bulk endpoints with 8 byte maxpacket */ - u_int8_t bDebugInEndpoint; - u_int8_t bDebugOutEndpoint; -}; - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */ -struct usb_interface_assoc_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int8_t bFirstInterface; - u_int8_t bInterfaceCount; - u_int8_t bFunctionClass; - u_int8_t bFunctionSubClass; - u_int8_t bFunctionProtocol; - u_int8_t iFunction; -} __attribute__ ((packed)); - - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_SECURITY: group of wireless security descriptors, including - * encryption types available for setting up a CC/association. - */ -struct usb_security_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int16_t wTotalLength; - u_int8_t bNumEncryptionTypes; -}; - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys - * may be retrieved. - */ -struct usb_key_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int8_t tTKID[3]; - u_int8_t bReserved; - u_int8_t bKeyData[0]; -}; - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */ -struct usb_encryption_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int8_t bEncryptionType; -#define USB_ENC_TYPE_UNSECURE 0 -#define USB_ENC_TYPE_WIRED 1 /* non-wireless mode */ -#define USB_ENC_TYPE_CCM_1 2 /* aes128/cbc session */ -#define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */ - u_int8_t bEncryptionValue; /* use in SET_ENCRYPTION */ - u_int8_t bAuthKeyIndex; -}; - - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_BOS: group of wireless capabilities */ -struct usb_bos_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int16_t wTotalLength; - u_int8_t bNumDeviceCaps; -}; - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ -struct usb_dev_cap_header { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int8_t bDevCapabilityType; -}; - -#define USB_CAP_TYPE_WIRELESS_USB 1 - -struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int8_t bDevCapabilityType; - - u_int8_t bmAttributes; -#define USB_WIRELESS_P2P_DRD (1 << 1) -#define USB_WIRELESS_BEACON_MASK (3 << 2) -#define USB_WIRELESS_BEACON_SELF (1 << 2) -#define USB_WIRELESS_BEACON_DIRECTED (2 << 2) -#define USB_WIRELESS_BEACON_NONE (3 << 2) - u_int16_t wPHYRates; /* bit rates, Mbps */ -#define USB_WIRELESS_PHY_53 (1 << 0) /* always set */ -#define USB_WIRELESS_PHY_80 (1 << 1) -#define USB_WIRELESS_PHY_107 (1 << 2) /* always set */ -#define USB_WIRELESS_PHY_160 (1 << 3) -#define USB_WIRELESS_PHY_200 (1 << 4) /* always set */ -#define USB_WIRELESS_PHY_320 (1 << 5) -#define USB_WIRELESS_PHY_400 (1 << 6) -#define USB_WIRELESS_PHY_480 (1 << 7) - u_int8_t bmTFITXPowerInfo; /* TFI power levels */ - u_int8_t bmFFITXPowerInfo; /* FFI power levels */ - u_int16_t bmBandGroup; - u_int8_t bReserved; -}; - -/*-------------------------------------------------------------------------*/ - -/* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with - * each endpoint descriptor for a wireless device - */ -struct usb_wireless_ep_comp_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - - u_int8_t bMaxBurst; - u_int8_t bMaxSequence; - u_int16_t wMaxStreamDelay; - u_int16_t wOverTheAirPacketSize; - u_int8_t bOverTheAirInterval; - u_int8_t bmCompAttributes; -#define USB_ENDPOINT_SWITCH_MASK 0x03 /* in bmCompAttributes */ -#define USB_ENDPOINT_SWITCH_NO 0 -#define USB_ENDPOINT_SWITCH_SWITCH 1 -#define USB_ENDPOINT_SWITCH_SCALE 2 -}; - -/*-------------------------------------------------------------------------*/ - -/* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless - * host and a device for connection set up, mutual authentication, and - * exchanging short lived session keys. The handshake depends on a CC. - */ -struct usb_handshake { - u_int8_t bMessageNumber; - u_int8_t bStatus; - u_int8_t tTKID[3]; - u_int8_t bReserved; - u_int8_t CDID[16]; - u_int8_t nonce[16]; - u_int8_t MIC[8]; -}; - -/*-------------------------------------------------------------------------*/ - -/* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC). - * A CC may also be set up using non-wireless secure channels (including - * wired USB!), and some devices may support CCs with multiple hosts. - */ -struct usb_connection_context { - u_int8_t CHID[16]; /* persistent host id */ - u_int8_t CDID[16]; /* device id (unique w/in host context) */ - u_int8_t CK[16]; /* connection key */ -}; - -/*-------------------------------------------------------------------------*/ - -/* USB 2.0 defines three speeds, here's how Linux identifies them */ - -enum usb_device_speed { - USB_SPEED_UNKNOWN = 0, /* enumerating */ - USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ - USB_SPEED_HIGH, /* usb 2.0 */ - USB_SPEED_VARIABLE, /* wireless (usb 2.5) */ -}; - -enum usb_device_state { - /* NOTATTACHED isn't in the USB spec, and this state acts - * the same as ATTACHED ... but it's clearer this way. - */ - USB_STATE_NOTATTACHED = 0, - - /* chapter 9 and authentication (wireless) device states */ - USB_STATE_ATTACHED, - USB_STATE_POWERED, /* wired */ - USB_STATE_UNAUTHENTICATED, /* auth */ - USB_STATE_RECONNECTING, /* auth */ - USB_STATE_DEFAULT, /* limited function */ - USB_STATE_ADDRESS, - USB_STATE_CONFIGURED, /* most functions */ - - USB_STATE_SUSPENDED - - /* NOTE: there are actually four different SUSPENDED - * states, returning to POWERED, DEFAULT, ADDRESS, or - * CONFIGURED respectively when SOF tokens flow again. - */ -}; - -#endif /* __LINUX_USB_CH9_H */ diff --git a/openpicc/include/usb_dfu.h b/openpicc/include/usb_dfu.h deleted file mode 100644 index 5000edc..0000000 --- a/openpicc/include/usb_dfu.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef _USB_DFU_H -#define _USB_DFU_H -/* USB Device Firmware Update Implementation for OpenPCD - * (C) 2006 by Harald Welte <hwelte@hmw-consulting.de> - * - * Protocol definitions for USB DFU - * - * This ought to be compliant to the USB DFU Spec 1.0 as available from - * http://www.usb.org/developers/devclass_docs/usbdfu10.pdf - * - */ - -#include <sys/types.h> - -#define USB_DT_DFU 0x21 - -struct usb_dfu_func_descriptor { - u_int8_t bLength; - u_int8_t bDescriptorType; - u_int8_t bmAttributes; -#define USB_DFU_CAN_DOWNLOAD (1 << 0) -#define USB_DFU_CAN_UPLOAD (1 << 1) -#define USB_DFU_MANIFEST_TOL (1 << 2) -#define USB_DFU_WILL_DETACH (1 << 3) - u_int16_t wDetachTimeOut; - u_int16_t wTransferSize; - u_int16_t bcdDFUVersion; -} __attribute__ ((packed)); - -#define USB_DT_DFU_SIZE 9 - -#define USB_TYPE_DFU (USB_TYPE_CLASS|USB_RECIP_INTERFACE) - -/* DFU class-specific requests (Section 3, DFU Rev 1.1) */ -#define USB_REQ_DFU_DETACH 0x00 -#define USB_REQ_DFU_DNLOAD 0x01 -#define USB_REQ_DFU_UPLOAD 0x02 -#define USB_REQ_DFU_GETSTATUS 0x03 -#define USB_REQ_DFU_CLRSTATUS 0x04 -#define USB_REQ_DFU_GETSTATE 0x05 -#define USB_REQ_DFU_ABORT 0x06 - -struct dfu_status { - u_int8_t bStatus; - u_int8_t bwPollTimeout[3]; - u_int8_t bState; - u_int8_t iString; -} __attribute__((packed)); - -#define DFU_STATUS_OK 0x00 -#define DFU_STATUS_errTARGET 0x01 -#define DFU_STATUS_errFILE 0x02 -#define DFU_STATUS_errWRITE 0x03 -#define DFU_STATUS_errERASE 0x04 -#define DFU_STATUS_errCHECK_ERASED 0x05 -#define DFU_STATUS_errPROG 0x06 -#define DFU_STATUS_errVERIFY 0x07 -#define DFU_STATUS_errADDRESS 0x08 -#define DFU_STATUS_errNOTDONE 0x09 -#define DFU_STATUS_errFIRMWARE 0x0a -#define DFU_STATUS_errVENDOR 0x0b -#define DFU_STATUS_errUSBR 0x0c -#define DFU_STATUS_errPOR 0x0d -#define DFU_STATUS_errUNKNOWN 0x0e -#define DFU_STATUS_errSTALLEDPKT 0x0f - -enum dfu_state { - DFU_STATE_appIDLE = 0, - DFU_STATE_appDETACH = 1, - DFU_STATE_dfuIDLE = 2, - DFU_STATE_dfuDNLOAD_SYNC = 3, - DFU_STATE_dfuDNBUSY = 4, - DFU_STATE_dfuDNLOAD_IDLE = 5, - DFU_STATE_dfuMANIFEST_SYNC = 6, - DFU_STATE_dfuMANIFEST = 7, - DFU_STATE_dfuMANIFEST_WAIT_RST = 8, - DFU_STATE_dfuUPLOAD_IDLE = 9, - DFU_STATE_dfuERROR = 10, -}; - -#endif /* _USB_DFU_H */ diff --git a/openpicc/os/boot/Cstartup.S b/openpicc/os/boot/Cstartup.S deleted file mode 100644 index 83e7696..0000000 --- a/openpicc/os/boot/Cstartup.S +++ /dev/null @@ -1,450 +0,0 @@ -/* AT91SAM7 low-level startup outines for OpenPCD / OpenPICC DFU loader - * (C) 2006 by Harald Welte <hwelte@hmw-consulting.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -/*------------------------------------------------------------------------------ -//*- ATMEL Microcontroller Software Support - ROUSSET - -//*------------------------------------------------------------------------------ -//* The software is delivered "AS IS" without warranty or condition of any -//* kind, either express, implied or statutory. This includes without -//* limitation any warranty or condition with respect to merchantability or -//* fitness for any particular purpose, or against the infringements of -//* intellectual property rights of others. -//*----------------------------------------------------------------------------- -//*- File source : Cstartup.s -//*- Object : Generic CStartup for KEIL and GCC No Use REMAP -//*- Compilation flag : None -//*- -//*- 1.0 18/Oct/04 JPP : Creation -//*- 1.1 21/Feb/05 JPP : Set Interrupt -//*- 1.1 01/Apr/05 JPP : save SPSR -//*-----------------------------------------------------------------------------*/ - -/* Enable DFU by press of hardware POI_BOOTLDR switch */ -#define CONFIG_DFU_SWITCH - -/* Enable DFU by magic value in RAM and software reset */ -#define CONFIG_DFU_MAGIC - -//#define DEBUG_LL - -#define PIOA_PER 0xFFFFF400 -#define PIOA_OER 0xFFFFF410 -#define PIOA_SODR 0xFFFFF430 -#define PIOA_CODR 0xFFFFF434 -#define LED1 25 /* this only works on OpenPICC, not Olimex */ - -#ifdef DEBUG_LL -/* Debugging macros for switching on/off LED1 (green) */ - .macro led1on - ldr r2, =PIOA_CODR - mov r1, #(1 << LED1) - str r1, [r2] - .endm - .macro led1off - ldr r2, =PIOA_SODR - mov r1, #(1 << LED1) - str r1, [r2] - .endm - .macro ledinit - ldr r2, =PIOA_PER - mov r1, #(1 << LED1) - str r1, [r2] - ldr r2, =PIOA_OER - str r1, [r2] - led1off - .endm -#else - .macro ledinit - .endm - .macro led1on - .endm - .macro led1off - .endm -#endif - - .equ IRQ_Stack_Size, 0x00000400 - .equ FIQ_Stack_Size, 0x00000400 - - .equ AIC_IVR, (256) - .equ AIC_FVR, (260) - .equ AIC_EOICR, (304) - .equ AIC_MCR_RCR, (0xf00) - .equ AT91C_BASE_AIC, (0xFFFFF000) - .equ AT91C_PMC_PCER, (0xFFFFFC10) - .equ AT91C_BASE_PIOA, (0xFFFFF400) - .equ AT91C_ID_PIOA, (2) - .equ PIOA_PDSR, (0x3c) -#if defined(PCD) - .equ PIO_BOOTLDR, (1 << 27) -#elif defined(PICC) - .equ PIO_BOOTLDR, (1 << 6) -#elif defined(OLIMEX) - .equ PIO_BOOTLDR, (1 << 19) -#else -#error please define PIO_BOOTLDR -#endif - - -/* #include "AT91SAM7S64_inc.h" */ - -/* Exception Vectors in RAM */ - - .text - .arm - .section .vectram, "ax" - - .global _remap_call_dfu - .func _remap_call_dfu -_remap_call_dfu: - led1on - /* Remap RAM to 0x00000000 for DFU */ - ldr r1, =AT91C_BASE_AIC - mov r2, #0x01 - str r2, [r1, #AIC_MCR_RCR] - - ldr r4, =dfu_main - bx r4 - - .size _remap_call_dfu, . - _remap_call_dfu - .endfunc - - -#;------------------------------------------------------------------------------ -#;- Section Definition -#;----------------- -#;- Section -#;- .internal_ram_top Top_Stack: used by the cstartup for vector initalisation -#;- management defined by ld and affect from ldscript -#;------------------------------------------------------------------------------ - .section .internal_ram_top - .code 32 - .align 0 - .global Top_Stack -Top_Stack: - -/*------------------------------------------------------------------------------ -*- Area Definition -*------------------------------------------------------------------------------ -* .text is used instead of .section .text so it works with arm-aout too. */ - .section .reset - .text -reset: -/*------------------------------------------------------------------------------ -//*- Exception vectors -//*-------------------- -//*- These vectors can be read at address 0 or at RAM address -//*- They ABSOLUTELY requires to be in relative addresssing mode in order to -//*- guarantee a valid jump. For the moment, all are just looping. -//*- If an exception occurs before remap, this would result in an infinite loop. -//*- To ensure if a exeption occurs before start application to infinite loop. -//*------------------------------------------------------------------------------*/ - - B InitReset /* 0x00 Reset handler */ -undefvec: - B undefvec /* 0x04 Undefined Instruction */ -swivec: - B swivec /* 0x08 Software Interrupt */ -pabtvec: - B pabtvec /* 0x0C Prefetch Abort */ -dabtvec: - b dabtvec /* 0x10 Data Abort */ -rsvdvec: - b rsvdvec /* 0x14 reserved */ -irqvec: - b IRQ_Handler_Entry /* 0x18 IRQ */ -fiqvec: - ldr pc, [pc, #-0xF20] /* 0x1c FIQ */ - -dfu_state_dummy: - .word 0 - - .global IRQ_Handler_Entry - .func IRQ_Handler_Entry - -FIQ_Handler_Entry: - -/*- Switch in SVC/User Mode to allow User Stack access for C code */ -/* because the FIQ is not yet acknowledged*/ - -/*- Save and r0 in FIQ_Register */ - mov r9, r0 - ldr r0, [r8, #AIC_FVR] - msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_SVC - - /*- Save scratch/used registers and LR in User Stack */ - stmfd sp!, { r1-r3, r12, lr} - - /*- Branch to the routine pointed by the AIC_FVR */ - mov r14, pc - bx r0 - - /*- Restore scratch/used registers and LR from User Stack */ - ldmia sp!, { r1-r3, r12, lr} - - /*- Leave Interrupts disabled and switch back in FIQ mode */ - msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ - - /*- Restore the R0 ARM_MODE_SVC register */ - mov r0,r9 - - /*- Restore the Program Counter using the LR_fiq directly in the PC */ - subs pc, lr, #4 - -IRQ_Handler_Entry: - - /*- Manage Exception Entry */ - /*- Adjust and save LR_irq in IRQ stack */ - sub lr, lr, #4 - stmfd sp!, {lr} - - /*- Save SPSR need to be saved for nested interrupt */ - mrs r14, SPSR - stmfd sp!, {r14} - - /*- Save and r0 in IRQ stack */ - stmfd sp!, {r0} - - /*- Write in the IVR to support Protect Mode */ - /*- No effect in Normal Mode */ - /*- De-assert the NIRQ and clear the source in Protect Mode */ - ldr r14, =AT91C_BASE_AIC - ldr r0 , [r14, #AIC_IVR] - str r14, [r14, #AIC_IVR] - - /*- Enable Interrupt and Switch in Supervisor Mode */ - msr CPSR_c, #ARM_MODE_SVC - - /*- Save scratch/used registers and LR in User Stack */ - stmfd sp!, { r1-r3, r12, r14} - - /*- Branch to the routine pointed by the AIC_IVR */ - mov r14, pc - bx r0 - - /*- Restore scratch/used registers and LR from User Stack*/ - ldmia sp!, { r1-r3, r12, r14} - - /*- Disable Interrupt and switch back in IRQ mode */ - msr CPSR_c, #I_BIT | ARM_MODE_IRQ - - /*- Mark the End of Interrupt on the AIC */ - ldr r14, =AT91C_BASE_AIC - str r14, [r14, #AIC_EOICR] - - /*- Restore SPSR_irq and r0 from IRQ stack */ - ldmia sp!, {r0} - - /*- Restore SPSR_irq and r0 from IRQ stack */ - ldmia sp!, {r14} - msr SPSR_cxsf, r14 - - /*- Restore adjusted LR_irq from IRQ stack directly in the PC */ - ldmia sp!, {pc}^ - - .size IRQ_Handler_Entry, . - IRQ_Handler_Entry - .endfunc - .align 0 -.RAM_TOP: - .word Top_Stack - - .global _startup - .func _startup -InitReset: -/*------------------------------------------------------------------------------ -/*- Low level Init (PMC, AIC, ? ....) by C function AT91F_LowLevelInit -/*------------------------------------------------------------------------------*/ - .extern AT91F_LowLevelInit -/*- minumum C initialization */ -/*- call AT91F_LowLevelInit( void) */ - - ldr r13,.RAM_TOP /* temporary stack in internal RAM */ -/*--Call Low level init function in ABSOLUTE through the Interworking */ - ldr r0,=AT91F_LowLevelInit - mov lr, pc - bx r0 - ledinit - -/*------------------------------------------------------------------------------ -//*- Top of Stack Definition -//*------------------------- -//*- Interrupt and Supervisor Stack are located at the top of internal memory in -//*- order to speed the exception handling context saving and restoring. -//*- ARM_MODE_SVC (Application, C) Stack is located at the top of the external memory. -//*------------------------------------------------------------------------------*/ - - .EQU ARM_MODE_FIQ, 0x11 - .EQU ARM_MODE_IRQ, 0x12 - .EQU ARM_MODE_SVC, 0x13 - - .EQU I_BIT, 0x80 - .EQU F_BIT, 0x40 - - -#define AT91C_RSTC_RSR 0xFFFFFD04 -#define AT91C_RSTC_RSTTYP_SOFTWARE (0x03 << 8) -#define DFU_STATE_appDETACH 1 - - -/*------------------------------------------------------------------------------ -//*- Setup the stack for each mode -//*-------------------------------*/ - mov r0,r13 - -/*- Set up Fast Interrupt Mode and set FIQ Mode Stack*/ - msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT - mov r13, r0 - sub r0, r0, #FIQ_Stack_Size - -/*- Init the FIQ register*/ - ldr r8, =AT91C_BASE_AIC - -/*- Set up Interrupt Mode and set IRQ Mode Stack*/ - msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT - mov r13, r0 /* Init stack IRQ */ - sub r0, r0, #IRQ_Stack_Size - -/*- Set up Supervisor Mode and set Supervisor Mode Stack*/ - msr CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT - mov r13, r0 /* Init stack Sup */ - -/* - Enable Interrupts and FIQ */ - msr CPSR_c, #ARM_MODE_SVC - -#ifdef CONFIG_DFU_MAGIC - ldr r1, =AT91C_RSTC_RSR - ldr r2, [r1] - #and r2, r2, AT91C_RSTC_RSTTYP - tst r2, #AT91C_RSTC_RSTTYP_SOFTWARE - beq dfu_magic_end - - ldr r1, =dfu_state - ldr r2, [r1] - cmp r2, #DFU_STATE_appDETACH - beq _reloc_dfu -dfu_magic_end: -#endif - -# Relocate DFU .data.shared section (Copy from ROM to RAM) - LDR R1, =_etext - LDR R2, =_data_shared - LDR R3, =_edata_shared -LoopRelDS: CMP R2, R3 - LDRLO R0, [R1], #4 - STRLO R0, [R2], #4 - BLO LoopRelDS - -/* -# Clear DFU .bss section (Zero init) - MOV R0, #0 - LDR R1, =__bss_start__ - LDR R2, =__bss_end__ -LoopZI: CMP R1, R2 - STRLO R0, [R1], #4 - BLO LoopZI -*/ - - /* prepare c function call to main */ - mov r0, #0 /* argc = 0 */ - ldr lr, =exit - ldr r10, =0x00104000 - -#ifdef CONFIG_DFU_SWITCH - /* check whether bootloader button is pressed */ - ldr r1, =AT91C_PMC_PCER - mov r2, #(1 << AT91C_ID_PIOA) - str r2, [r1] - - ldr r1, =AT91C_BASE_PIOA - ldr r2, [r1, #PIOA_PDSR] - tst r2, #PIO_BOOTLDR - bne _reloc_dfu -#endif - - bx r10 - -_reloc_dfu: - /* Relocate DFU .data section (Copy from ROM to RAM) */ - LDR R1, =_data_flash - LDR R2, =_data - LDR R3, =_edata -LoopRel: CMP R2, R3 - LDRLO R0, [R1], #4 - STRLO R0, [R2], #4 - BLO LoopRel - - /* Clear DFU .bss section (Zero init) */ - MOV R0, #0 - LDR R1, =__bss_start__ - LDR R2, =__bss_end__ -LoopZI: CMP R1, R2 - STRLO R0, [R1], #4 - BLO LoopZI - - /* relocate DFU .text into RAM */ - ldr r1, =0x00100000 - ldr r2, =0x00200000 - ldr r3, =_etext - add r3, r3, r2 -loop_rel_t: cmp r2, r3 - ldrlo r4, [r1], #4 - strlo r4, [r2], #4 - blo loop_rel_t - ldr r4, =_remap_call_dfu - bx r4 - - .size _startup, . - _startup - .endfunc - -/* "exit" dummy to avoid sbrk write read etc. needed by the newlib default "exit" */ - .global exit - .func exit -exit: - b . - .size exit, . - exit - .endfunc - -/*--------------------------------------------------------------- -//* ?EXEPTION_VECTOR -//* This module is only linked if needed for closing files. -//*---------------------------------------------------------------*/ - .global AT91F_Default_FIQ_handler - .func AT91F_Default_FIQ_handler -AT91F_Default_FIQ_handler: - b AT91F_Default_FIQ_handler - .size AT91F_Default_FIQ_handler, . - AT91F_Default_FIQ_handler - .endfunc - - .global AT91F_Default_IRQ_handler - .func AT91F_Default_IRQ_handler -AT91F_Default_IRQ_handler: - b AT91F_Default_IRQ_handler - .size AT91F_Default_IRQ_handler, . - AT91F_Default_IRQ_handler - .endfunc - - .global AT91F_Spurious_handler - .func AT91F_Spurious_handler -AT91F_Spurious_handler: - b AT91F_Spurious_handler - .size AT91F_Spurious_handler, . - AT91F_Spurious_handler - .endfunc - - - - .end - diff --git a/openpicc/os/boot/Cstartup_SAM7.c b/openpicc/os/boot/Cstartup_SAM7.c index 4ab263f..450a95e 100644 --- a/openpicc/os/boot/Cstartup_SAM7.c +++ b/openpicc/os/boot/Cstartup_SAM7.c @@ -8,83 +8,60 @@ //* intellectual property rights of others. //*---------------------------------------------------------------------------- //* File Name : Cstartup_SAM7.c -//* Object : Low level initializations written in C for GCC Tools -//* Creation : 12/Jun/04 -//* 1.2 28/Feb/05 JPP : LIB change AT91C_WDTC_WDDIS & PLL -//* 1.3 21/Mar/05 JPP : Change PLL Wait time +//* Object : Low level initializations written in C for IAR +//* tools +//* 1.0 08/Sep/04 JPP : Creation +//* 1.10 10/Sep/04 JPP : Update AT91C_CKGR_PLLCOUNT filed //*---------------------------------------------------------------------------- + // Include the board file description #include <board.h> -// The following functions must be write in ARM mode this function called directly -// by exception vector -extern void AT91F_Spurious_handler (void); -extern void AT91F_Default_IRQ_handler (void); -extern void AT91F_Default_FIQ_handler (void); - //*---------------------------------------------------------------------------- //* \fn AT91F_LowLevelInit //* \brief This function performs very low level HW initialization //* this function can be use a Stack, depending the compilation //* optimization mode //*---------------------------------------------------------------------------- -void -AT91F_LowLevelInit (void) +void AT91F_LowLevelInit (void) { - volatile int i; - - //* Debounce power supply - for(i=0;i<1024;i++); - - AT91PS_PMC pPMC = AT91C_BASE_PMC; - //* Set Flash Waite sate - // Single Cycle Access at Up to 30 MHz, or 40 - // if MCK = 47923200 I have 50 Cycle for 1 usecond ( flied MC_FMR->FMCN - AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN) & (48 << 16)) | AT91C_MC_FWS_1FWS; + AT91PS_PMC pPMC = AT91C_BASE_PMC; + + //* Set flash wait state + // Single Cycle Access at Up to 30 MHz, or 40 + // if MCK = 47923200 I have 50 Cycle for 1 useconde ( flied MC_FMR->FMCN + AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN) & (75 << 16)) | AT91C_MC_FWS_1FWS; - //* Set MCK at 47 923 200 - // 1 Enabling the Main Oscillator: - // SCK = 1/32768 = 30.51 uSecond - // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms - pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT) & (0x06 << 8)) | AT91C_CKGR_MOSCEN; - // Wait the startup time - while (!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); - // 2 Checking the Main Oscillator Frequency (Optional) - // 3 Setting PLL and divider: - // - div by 24 Fin = 0,7680 =(18,432 / 24) - // - Mul 125: Fout = 96,0000 =(0,7680 *125) - // for 96 MHz the erroe is 0.16% - // Field out NOT USED = 0 - // PLLCOUNT pll startup time estimate at : 0.844 ms - // PLLCOUNT 28 = 0.000844 /(1/32768) -#if 0 - pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | - (AT91C_CKGR_PLLCOUNT & (28 << 8)) | - (AT91C_CKGR_MUL & (25 << 16))); -#else - pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 24) | - (AT91C_CKGR_PLLCOUNT & (28 << 8)) | - (AT91C_CKGR_MUL & (125 << 16))); -#endif + //* Watchdog Enable + AT91C_BASE_WDTC->WDTC_WDMR = (0x80 << 16) | AT91C_WDTC_WDRSTEN | 0x80; - // Wait the startup time - while (!(pPMC->PMC_SR & AT91C_PMC_LOCK)); - while (!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); - // 4. Selection of Master Clock and Processor Clock - // select the PLL clock divided by 2 - pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; - while (!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); + //* Set MCK at 47 923 200 + // 1 Enabling the Main Oscillator: + // SCK = 1/32768 = 30.51 uSeconde + // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms + pPMC->PMC_MOR = (((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN)); + // Wait the startup time - pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; - while (!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); + while (!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); + // 2 Checking the Main Oscillator Frequency (Optional) + // 3 Setting PLL and divider: + // - div by 5 Fin = 3,6864 =(18,432 / 5) + // - Mul 25+1: Fout = 95,8464 =(3,6864 *26) + // for 96 MHz the erroe is 0.16% + //eld out NOT USED = 0 Fi + pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 5) | + (AT91C_CKGR_PLLCOUNT & (28 << 8)) | + (AT91C_CKGR_MUL & (25 << 16))); - // Set up the default interrupts handler vectors - AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler; - for (i = 1; i < 31; i++) - { - AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler; - } - AT91C_BASE_AIC->AIC_SPU = (int) AT91F_Spurious_handler; + // Wait the startup time + while (!(pPMC->PMC_SR & AT91C_PMC_LOCK)); + + // 4. Selection of Master Clock and Processor Clock + // select the PLL clock divided by 2 + pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; + while (!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); + pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; + while (!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); } diff --git a/openpicc/os/boot/Cstartup_app.S b/openpicc/os/boot/Cstartup_app.S deleted file mode 100644 index 448cc93..0000000 --- a/openpicc/os/boot/Cstartup_app.S +++ /dev/null @@ -1,194 +0,0 @@ -/* Cstartup header for the application to be started by at91dfu - * (C) 2006 by Harald Welte <hwelte@hmw-consulting.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - - -//#define DEBUG_LL - - .equ AIC_FVR, (260) - .equ AIC_EOICR, (304) - .equ AT91C_BASE_AIC, (0xFFFFF000) - .equ ARM_MODE_FIQ, 0x11 - .equ ARM_MODE_IRQ, 0x12 - .equ ARM_MODE_SVC, 0x13 - - .equ I_BIT, 0x80 - .equ F_BIT, 0x40 - - -#define AT91C_BASE_PIOA 0xFFFFF400 -#define AT91C_BASE_TC0 0xFFFA0000 -#define AT91C_TC_SWTRG (1 << 2) -#define PIOA_SODR 0x30 -#define PIOA_CODR 0x34 -#define PIOA_PDSR 0x3c -#define PIOA_ISR 0x4c -#define PIOA_IDR 0x44 -#define PIO_DATA (1 << 27) -#define TC_CCR 0x00 - - -#define PIO_LED1 (1 << 25) /* this only works on OpenPICC, not Olimex */ - -#ifdef DEBUG_LL -/* Debugging macros for switching on/off LED1 (green) */ -#define PIOA_PER 0xFFFFF400 -#define PIOA_OER 0xFFFFF410 - .macro led1on - ldr r2, =AT91C_BASE_PIOA - mov r1, #PIO_LED1 - str r1, [r2, #PIOA_CODR] - .endm - .macro led1off - ldr r2, =AT91C_BASE_PIOA - mov r1, #PIO_LED1 - str r1, [r2, #PIOA_SODR] - .endm - .macro ledinit - ldr r2, =PIOA_PER - mov r1, #PIO_LED1 - str r1, [r2] - ldr r2, =PIOA_OER - str r1, [r2] - led1off - .endm -#else - .macro ledinit - .endm - .macro led1on - .endm - .macro led1off - .endm -#endif - - .global _startup - .func _startup -_startup: - /* Relocate .data section (copy from Flash to RAM) */ - ldr r1, =_etext - ldr r2, =_data - ldr r3, =_edata -loop_r: cmp r2, r3 - ldrlo r0, [r1], #4 - strlo r0, [r2], #4 - blo loop_r - - /* Clear .bss section (Zero init) */ - mov r0, #0 - ldr r1, =__bss_start__ - ldr r2, =__bss_end__ -loop_z: cmp r1, r2 - strlo r0, [r1], #4 - blo loop_z - - /* initialize FIQ mode registers */ - msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT - ldr r10, =AT91C_BASE_PIOA - ldr r12, =AT91C_BASE_TC0 - mov r9, #AT91C_TC_SWTRG - msr CPSR_c, #ARM_MODE_SVC - - led1on - - /* prepare C function call to main */ - mov r0, #0 /* argc = 0 */ - ldr lr, =exit - ldr r10, =main - - bx r10 - - .size _startup, . - _startup - .endfunc - -/* "exit" dummy to avoid sbrk write read etc. needed by the newlib default "exit" */ - .global exit - .func exit -exit: - b . - .size exit, . - exit - .endfunc - - -#define LED_TRIGGER -#define CALL_PIO_IRQ_DEMUX - - .text - .arm - .section .fastrun, "ax" - - .global fiq_handler - .func fiq_handler -fiq_handler: - /* code that uses pre-initialized FIQ reg */ - /* r8 AT91C_BASE_AIC (dfu init) - r9 AT91C_TC_SWTRG - r10 AT91C_BASE_PIOA - r11 tmp - r12 AT91C_BASE_TC0 - r13 stack - r14 lr - */ - - ldr r8, [r10, #PIOA_ISR] - tst r8, #PIO_DATA /* check for PIO_DATA change */ - ldrne r11, [r10, #PIOA_PDSR] - tstne r11, #PIO_DATA /* check for PIO_DATA == 1 */ - strne r9, [r12, #TC_CCR] /* software trigger */ -#ifdef LED_TRIGGER - movne r11, #PIO_LED1 - strne r11, [r10, #PIOA_CODR] /* enable LED */ -#endif - -#if 1 - movne r11, #PIO_DATA - strne r11, [r10, #PIOA_IDR] /* disable further PIO_DATA FIQ */ -#endif - - /*- Mark the End of Interrupt on the AIC */ - ldr r11, =AT91C_BASE_AIC - str r11, [r11, #AIC_EOICR] - -#ifdef LED_TRIGGER - mov r11, #PIO_LED1 - str r11, [r10, #PIOA_SODR] /* disable LED */ -#endif - -#ifdef CALL_PIO_IRQ_DEMUX - /* push r0, r1-r3, r12, r14 onto FIQ stack */ - stmfd sp!, { r0-r3, r12, lr} - mov r0, r8 - - /* enable interrupts while handling demux */ - /* msr CPSR_c, #F_BIT | ARM_MODE_SVC */ - - /* Call C function, give PIOA_ISR as argument */ - ldr r11, =__pio_irq_demux - mov r14, pc - bx r11 - - /* msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ */ - ldmia sp!, { r0-r3, r12, lr } -#endif - - /*- Restore the Program Counter using the LR_fiq directly in the PC */ - subs pc, lr, #4 - - .size fiq_handler, . - fiq_handler - .endfunc - .end - |