This commit is contained in:
2015-11-15 18:18:42 +00:00
parent 9ac343fc45
commit 72be7b0c2f
580 changed files with 356252 additions and 6 deletions
+131
View File
@@ -0,0 +1,131 @@
- data that is needed from both app and dfu mode
- code that is needed from both app and dfu mode
- function pointers
- copy code to RAM in case of DFU switch
- data that is only needed in DFU mode
- can be overwritten in case of reset-to-application
- data that is only needed in app mode
- can be overwritten with DFU data in case of DFU switch
- code that is only needed in DFU mode
- has to be copied to ram in case of DFU switch
- code that is only needed in app mode
- can be read from flash, no action required
=> abandoned that complicated idea.
now all DFU functions are __ramfunc's and thus always present.
interaction between app and dfu code:
- dfu_switch(void)
- dfu_status (can be put in accessor function, if required)
- dfu_cfg_descriptor
- dfu_dev_descriptor
- dfu_ep0_handler()
order of events at boot;
- start at reset vector in flash
- AT91F_LowLevelInit()
- setup stack for each mode
- relocate 'data' of bootloader, including ramfunc/vectram
- clear 'bss' of bootloader
- call remap command
- call usb initialization (irq, clock)
- if keypress,
- call dfu_main()
- wait for ep0 / busreset interrupt
- else call main()
memory layout:
0: lowlevel startup code
Cstartup.o 0x00bc
Cstartup_SAM7.o 0x0100
dfufunc 0x1dcc
dfustruct 0x0038
text text 0x0070
data data 0x0000
bss bss 0x000c
flash = text + data (= 8k)
ram/rel = data + bss (12 bytes)
If we drop the DFU-can-flash-DFU requirement, we can leave all DFU related code
in flash. no need for any function to be permanently in RAM. However, not
preventing this feature in some future version, we shouldn't do that.
Function DFU runtime
udp_init x x RAM
udp_ep0_send_data x x RAM
udp_ep0_send_zlp x x RAM
udp_sp0_send_stall x x RAM
handle_dnload x - flash/relocated
handle_upload x - flash/relocated
handle_getstatus x - flash/relocated
handle_getstate x - flash/relocated
dfu_ep0_handler x x RAM
dfu_dev_descriptor x - flash/relocated
dfu_cfg_descriptor x - flash/relocated
dfu_udp_ep0_handler x - flash/relocated
dfu_udp_irq x - flash/relocated
dfu_switch - x RAM
dfu_main x - flash/relocated
vectram x x flash/relocated/switched
IRQ_Handler_EntryR x x flash/relocated/switched
_remap x - flash/reloaded
dfu_api x x flash (const anyway)
dfu_state x x RAM
preconditions:
- dfu code assumes to be loaded to address zero to make it work from both ram and rom
startup:
- exception vectors (in flash)
- call lowlevel_init
- setup user/supervisor/FIQ/IRQ stack
- relocate dfu_state
- if DFU switch is pressed
- jump to dfu_main in flash
- relocate all of DFU .text/.data into ram (including exception vectors)
- initialize DFU .bss
- remap RAM to address zero
- if DFU switch is not pressed jump to entry address of app
- Cstartup_app.S
- relocate application .data
- initialize application .bss
- jump to appliction main
- application uses dfu_api in flash, pointing to in-flash data
- application calls dfu_switch()
- disable all interupts but USB
- relocate all of DFU .text/.data into ram (including exception vectors)
- remap RAM to address zero
- check whether app has already remapped RAM before !?!
memory map:
load_addr run_Addr
0x00100000 0x00000000 exception vectors (DFU Cstartup)
Cstartup_SAM7
0x00200000
DFU constants:
_etext:
_data: 0x200000
_edata:
APP contants:
_data: _edata_dfu
+34
View File
@@ -0,0 +1,34 @@
- code to control digital potentiometers via SPI [MM]
- chip select not SPI CS
- idea: use comparator to determine voltage range, then reconfigure amplifier
- later
- problem: capacitance of digital poti
- idea 1:
- idea 2: logarithmic amplifier using transistor
- ADC driver
- core [MM]
- trigger function (we want to read all values ASAP)
- callback function (once new values are available)
- init function (initialize ADC)
- USB integration [HW]
- simple READ_ADC command
- one reply packet with all ADC channels
- OS timer
- how often?
- 'load modulation' driver
x set PA2/PA3 to binary 0..3
x add IO definitions for
- PLL INHIBIT low
- SPI_SS1_GAIN
- SPI_SS2_DATA_THRESHOLD
- BOOTLDR
- sampled data continuous output into file / stdout
- trigger sampling by raising/falling edge (configurable)
- sample only one buffer
+42
View File
@@ -0,0 +1,42 @@
PICCSIM design
ISO14443 anticollision:
- Configure TC
- to reset TC2 on every falling edge
- to use FORCE_FAST for TC IRQ
- to enable TC2 ETRGS
- CARRIER_DIV is switched to 212kHz / 424kHz
- this results in SSC Rx is 4x (2x?) oversampling
- Set SSC Rx start condition to 4x/2x SOF pattern
- upon reception of first falling edge, we
- end up in TC FIQ
- read out TC0 current value
- reconfigure TC0 RA/RB to be in-phase with previously-read TC0
value (subtracting some fixed offset depending on FIQ latency)
- reconfigure TC2
- to use external event on every rising edge
- to reset(trigger) on every external event
- to clear TIOA2 on RC compare (RC is high)
- to set TIOA2 on RA compare (RA set later)
- disable TC2 IRQ (and FIQ FAST_FORCE)
- Wait for SSC Rx Interrupt (DMA complete, or PIO)
- Read and decode single 32bit word
- determine whether it is REQA or WUPA
- abort if not, start over
- depending on last bit 0/1, configure TC2 RA (FDT)
- recconfig TC0 to produce 1.6MHz CARRIER_DIV clock for SSC Tx
- make sure this is done synchronously
-
- set up SSC Tx
- DMA with pre-encoded (and user-configured) ATQA
- start Tx at a rising edge of TF (asserted by TC2 RA)
- Send Interrupt once TX DMA is done
- Once TC2 RA compare happens, the rising edge of TIOA2 will trigger SSC
- Wait for SSC Tx DMA to finish
- Repeat similar steps for ANTICOL/SELECT command, differences:
- single-byte compare after frame Rx is not sufficient
- evaluate number of valid bits ASAP
- we might receive and transmit split frame at non-byte-boundaries
- just shift a prepared ANTICOL/Select response
- make sure parity is handled correctly!
- Once we've completed the select, we go on with normal