#ifndef _AT91DBGUREG_H_
#define _AT91DBGUREG_H_
#define AT91DBGU_BASE 0xFFFFF200
#define AT91DBGU_SIZE 0x200
#define DBGU_CR 0x00UL
#define DBGU_MR 0x04UL
#define DBGU_IER 0x08UL
#define DBGU_IDR 0x0CUL
#define DBGU_IMR 0x10UL
#define DBGU_SR 0x14UL
#define DBGU_RHR 0x18UL
#define DBGU_THR 0x1CUL
#define DBGU_BRGR 0x20UL
#define DBGU_CIDR 0x40UL
#define DBGU_EXID 0x44UL
#define DBGU_FNR 0x48UL
#define DBGU_PDC 0x100UL
#define DBGU_CR_RSTSTA 0x100
#define DBGU_CR_TXDIS 0x080
#define DBGU_CR_TXEN 0x040
#define DBGU_CR_RXDIS 0x020
#define DBGU_CR_RXEN 0x010
#define DBGU_CR_RSTTX 0x008
#define DBGU_CR_RSTRX 0x004
#define DBGU_MR_CHMODE 0xC000
#define DBGU_MR_CHMOD_NORMAL 0x0000
#define DBGU_MR_CHMOD_ECHO 0x4000
#define DBGU_MR_CHMOD_LOCAL_LOOP 0x8000
#define DBGU_MR_CHMOD_REMOTE_LOOP 0xC000
#define DBGU_MR_PAR 0x0E00
#define DBGU_MR_PAR_EVEN 0x0000
#define DBGU_MR_PAR_ODD 0x0200
#define DBGU_MR_PAR_SPACE 0x0400
#define DBGU_MR_PAR_MARK 0x0600
#define DBGU_MR_PAR_NONE 0x0800
#define DBGU_INT_COMMRX 0x80000000
#define DBGU_INT_COMMTX 0x40000000
#define DBGU_INT_RXBUFF 0x00001000
#define DBGU_INT_TXBUFE 0x00000800
#define DBGU_INT_TXEMPTY 0x00000200
#define DBGU_INT_PARE 0x00000080
#define DBGU_INT_FRAME 0x00000040
#define DBGU_INT_OVRE 0x00000020
#define DBGU_INT_ENDTX 0x00000010
#define DBGU_INT_ENDRX 0x00000008
#define DBGU_INT_TXRDY 0x00000002
#define DBGU_INT_RXRDY 0x00000001
#define DBGU_SR_COMMRX 0x80000000
#define DBGU_SR_COMMTX 0x40000000
#define DBGU_SR_RXBUFF 0x00001000
#define DBGU_SR_TXBUFE 0x00000800
#define DBGU_SR_TXEMPTY 0x00000200
#define DBGU_SR_PARE 0x00000080
#define DBGU_SR_FRAME 0x00000040
#define DBGU_SR_OVRE 0x00000020
#define DBGU_SR_ENDTX 0x00000010
#define DBGU_SR_ENDRX 0x00000008
#define DBGU_SR_TXRDY 0x00000002
#define DBGU_SR_RXRDY 0x00000001
#define DBGU_CIDR_EXT 0x80000000
#define DBGU_CIDR_NVPTYP 0x70000000
#define DBGU_CIDR_NVPTYP_ROM 0x00000000
#define DBGU_CIDR_NVPTYP_ROMLESS 0x10000000
#define DBGU_CIDR_NVPTYP_SRAM 0x40000000
#define DBGU_CIDR_NVPTYP_FLASH 0x20000000
#define DBGU_CIDR_NVTYP_ROM_FLASH 0x30000000
#define DBGU_CIDR_ARCH 0x0FF00000
#define DBGU_CIDR_ARCH_AT91SAM9XX 0x01900000
#define DBGU_CIDR_ARCH_AT91SAM9XEXX 0x02900000
#define DBGU_CIDR_ARCH_AT91X34 0x03400000
#define DBGU_CIDR_ARCH_CAP9 0x03900000
#define DBGU_CIDR_ARCH_AT91X40 0x04000000
#define DBGU_CIDR_ARCH_AT91X42 0x04200000
#define DBGU_CIDR_ARCH_AT91X55 0x05500000
#define DBGU_CIDR_ARCH_AT91SAM7AXX 0x06000000
#define DBGU_CIDR_ARCH_AT91X63 0x06300000
#define DBGU_CIDR_ARCH_AT91SAM7SXX 0x07000000
#define DBGU_CIDR_ARCH_AT91SAM7XCXX 0x07100000
#define DBGU_CIDR_ARCH_AT91SAM7SEXX 0x07200000
#define DBGU_CIDR_ARCH_AT91SAM7LXX 0x07300000
#define DBGU_CIDR_ARCH_AT91SAM7XXX 0x07500000
#define DBGU_CIDR_ARCH_AT91X92 0x09200000
#define DBGU_CIDR_ARCH_AT75CXX 0x0F000000
#define DBGU_CIDR_SRAMSIZ 0x000F0000
#define DBGU_CIDR_SRAMSIZ_1K 0x00010000
#define DBGU_CIDR_SRAMSIZ_2K 0x00020000
#define DBGU_CIDR_SRAMSIZ_4K 0x00050000
#define DBGU_CIDR_SRAMSIZ_8K 0x00080000
#define DBGU_CIDR_SRAMSIZ_16K 0x00090000
#define DBGU_CIDR_SRAMSIZ_32K 0x000A0000
#define DBGU_CIDR_SRAMSIZ_64K 0x000B0000
#define DBGU_CIDR_SRAMSIZ_128K 0x000C0000
#define DBGU_CIDR_SRAMSIZ_256K 0x000D0000
#define DBGU_CIDR_SRAMSIZ_96K 0x000E0000
#define DBGU_CIDR_SRAMSIZ_512K 0x000F0000
#define DBGU_CIDR_NVPSIZ 0x00000F00
#define DBGU_CIDR_NVPSIZ_NONE 0x00000000
#define DBGU_CIDR_NVPSIZ_8K 0x00000100
#define DBGU_CIDR_NVPSIZ_16K 0x00000200
#define DBGU_CIDR_NVPSIZ_32K 0x00000300
#define DBGU_CIDR_NVPSIZ_64K 0x00000500
#define DBGU_CIDR_NVPSIZ_128K 0x00000700
#define DBGU_CIDR_NVPSIZ_256K 0x00000900
#define DBGU_CIDR_NVPSIZ_512K 0x00000A00
#define DBGU_CIDR_NVPSIZ_1024K 0x00000C00
#define DBGU_CIDR_NVPSIZ_2048K 0x00000E00
#define DBGU_CIDR_NPVSIZ2 0x0000F000
#define DBGU_CIDR_NVPSIZ2_NONE 0x00000000
#define DBGU_CIDR_NVPSIZ2_8K 0x00001000
#define DBGU_CIDR_NVPSIZ2_16K 0x00002000
#define DBGU_CIDR_NVPSIZ2_32K 0x00003000
#define DBGU_CIDR_NVPSIZ2_64K 0x00005000
#define DBGU_CIDR_NVPSIZ2_128K 0x00007000
#define DBGU_CIDR_NVPSIZ2_256K 0x00009000
#define DBGU_CIDR_NVPSIZ2_512K 0x0000A000
#define DBGU_CIDR_NVPSIZ2_1024K 0x0000C000
#define DBGU_CIDR_NVPSIZ2_2048K 0x0000E000
#define DBGU_CIDR_EPROC 0x000000E0
#define DBGU_CIDR_EPROC_946ES 0x00000020
#define DBGU_CIDR_EPROC_7TDMI 0x00000040
#define DBGU_CIDR_EPROC_920T 0x00000080
#define DBGU_CIDR_EPROC_926EJS 0x000000E0
#define DBGU_CIDR_VERSION 0x0000001F
#define DBGU_CIDR_AT91RM9200 0x09290781
#define DBGU_CIDR_AT91SAM9260 0x019803A2
#define DBGU_CIDR_AT91SAM9261 0x019703A0
#define DBGU_CIDR_AT91SAM9263 0x019607A0
#define AT91RM9200_CHIP_ID DBGU_CIDR_AT91RM9200
#define AT91SAM9260_CHIP_ID DBGU_CIDR_AT91SAM9260
#define AT91SAM9261_CHIP_ID DBGU_CIDR_AT91SAM9261
#define AT91SAM9263_CHIP_ID DBGU_CIDR_AT91SAM9263
#define DBGUREG(reg) *((volatile uint32_t*)(AT91DBGU_BASE + (reg)))
#define DBGU_INIT(mstclk, speed) do { \
DBGUREG(DBGU_PDC + PDC_PTCR) = PDC_PTCR_TXTDIS | PDC_PTCR_RXTDIS; \
DBGUREG(DBGU_BRGR) = ((mstclk) / 16 + (speed) / 2) / (speed); \
DBGUREG(DBGU_MR) = DBGU_MR_PAR_NONE; \
DBGUREG(DBGU_CR) = DBGU_CR_RSTSTA | DBGU_CR_RSTTX | DBGU_CR_RSTRX; \
DBGUREG(DBGU_CR) = DBGU_CR_TXEN | DBGU_CR_RXEN; \
(void)DBGUREG(DBGU_SR); \
} while (0)
#define DBGU_PUTC(ch) do { \
int s = splserial(); \
while ((DBGUREG(DBGU_SR) & DBGU_SR_TXRDY) == 0) { \
splx(s); s = splserial(); \
}; \
DBGUREG(DBGU_THR) = ch; \
splx(s); \
} while (0)
#define DBGU_PEEKC() ((DBGUREG(DBGU_SR) & DBGU_SR_RXRDY) ? DBGUREG(DBGU_RHR) : -1)
#define DBGU_PUTS(string) do { \
const char *_ptr = (string); \
while (*_ptr) { \
DBGU_PUTC(*_ptr); \
_ptr++; \
} \
} while (0)
#endif