Atmelin XMEGA mikrokontrollereihin liittyvää tauhkaa

(nämä testattu nyt Mac OS X + CrossPack-AVR-20121207.dmg)

Vaihda 32a4 -> 128a1, jos käytät isoa punaista lautaa!

Testisoftien kääntö ilman makefilehirvityksiä
Tällä saadaan DFU-bootloaderi sisään
Tällä saadaan piiri menemään bootissa DFU-moodiin
----hombrew updated formula (brew edit dfu-programmer)------
require 'formula'

class DfuProgrammer < Formula
  head 'https://github.com/nedos/dfu-programmer.git'
  homepage 'https://github.com/nedos/dfu-programmer'

  depends_on 'libusb-compat'

  def install
    system "./configure", "--disable-debug", "--disable-dependency-tracking",
                          "--prefix=#{prefix}"
    system "make install"
  end
end
----/hombrew updated formula------


-suovulan dfu-programmer korjaus 128A1U:lle, julkaistaan kun on paremmin testailtu-
Binary batching different sense pin to DFU-bootloaders

/usr/local/CrossPack-AVR/avr/include/avr/iox32a4u.h
/usr/local/CrossPack-AVR/avr/include/avr/iox128a1u.h

atxmega32a4u_104.hex = pin PC3
PC3 -> PD3
F0924006    ->    F0926006
00935306    ->    00937306
00914806    ->    00916806
03FF            ->    03FF            
F0925306    ->    F0927306

Pin 3 -> 0
00937306    ->    00937006
03FF            ->    00FF
F0927306    ->    F0927006

PF0/5 -> PJ7
F092A006    ->    F0920007
0093B506    ->    00931707
0091A806    ->    00910807
00FF            ->    07FF
F092B506    ->    F0921707

PD0 -> PE0
F0926006    ->    F0928006
00937006    ->    00939006
00916806    ->    00918806
00FF            ->    00FF
F0927006    ->    F0929006


PORTA_DIR = 0x0600, PORTA_IN = 0x0648, PORTA_PINxCTRL = 0x061x
PORTB_DIR = 0x0620, PORTB_IN = 0x0628, PORTB_PINxCTRL = 0x063x
PORTC_DIR = 0x0640, PORTC_IN = 0x0648, PORTC_PINxCTRL = 0x065x
PORTD_DIR = 0x0660, PORTD_IN = 0x0668, PORTD_PINxCTRL = 0x067x
PORTE_DIR = 0x0680, PORTE_IN = 0x0688, PORTE_PINxCTRL = 0x069x
PORTF_DIR = 0x06A0, PORTF_IN = 0x06A8, PORTF_PINxCTRL = 0x06Bx

PORTH_DIR = 0x06E0, PORTH_IN = 0x06E8, PORTH_PINxCTRL = 0x06Fx
PORTJ_DIR = 0x0700, PORTJ_IN = 0x0708, PORTJ_PINxCTRL = 0x071x
PORTK_DIR = 0x0720, PORTK_IN = 0x0728, PORTK_PINxCTRL = 0x073x

PORTQ_DIR = 0x07C0, PORTQ_IN = 0x07C8, PORTQ_PINxCTRL = 0x07Dx
PORTR_DIR = 0x07E0, PORTR_IN = 0x07E8, PORTR_PINxCTRL = 0x07Fx


Atomiset käyskyt jotka löytyvät uudemmista xmegoista:

inline uint8_t atomicExchange(volatile uint8_t * ptr, uint8_t val) {
    // uint8_t tmp = *ptr; *ptr = val; val = tmp; 
    asm volatile ("xch    Z, %0" : "=r" (val)    : "z" (ptr), "0" (val));
    return val;
}

inline uint8_t atomicLoadAndSet(volatile uint8_t * ptr, uint8_t val) {
    // uint8_t tmp = *ptr; *ptr = tmp | val; val = tmp;
    asm volatile ("las    Z, %0" : "=r" (val)    : "z" (ptr), "0" (val));
    return val;
}

inline uint8_t atomicLoadAndClear(volatile uint8_t * ptr, uint8_t val) {
    // uint8_t tmp = *ptr; *ptr = tmp & ~val; val = tmp;
    asm volatile ("lac    Z, %0" : "=r" (val)    : "z" (ptr), "0" (val));
    return val;
}

inline uint8_t atomicLoadAndToggle(volatile uint8_t * ptr, uint8_t val) {
    // uint8_t tmp = *ptr; *ptr = tmp ^ val; val = tmp;
    asm volatile ("lat    Z, %0" : "=r" (val)    : "z" (ptr), "0" (val));        
    return val;    
}