summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openpicc/Makefile.dfu566
-rw-r--r--openpicc/application/flash.c68
-rw-r--r--openpicc/application/flash.h5
-rw-r--r--openpicc/application/main.c2
-rw-r--r--openpicc/config/board.h19
-rw-r--r--openpicc/dfu/dbgu.c140
-rw-r--r--openpicc/dfu/dbgu.h25
-rw-r--r--openpicc/dfu/dfu.c938
-rw-r--r--openpicc/dfu/dfu.h143
-rw-r--r--openpicc/dfu/usb_strings_dfu.h120
-rw-r--r--openpicc/dfu/usb_strings_dfu.txt5
-rw-r--r--openpicc/include/compile.h9
-rw-r--r--openpicc/include/usb_ch9.h550
-rw-r--r--openpicc/include/usb_dfu.h81
-rw-r--r--openpicc/os/boot/Cstartup.S450
-rw-r--r--openpicc/os/boot/Cstartup_SAM7.c101
-rw-r--r--openpicc/os/boot/Cstartup_app.S194
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
-
personal git repositories of Harald Welte. Your mileage may vary