| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | #ifndef IODEV_H#define IODEV_H/* Address for I/O device d, subregister r, offset o */#define IODEVA(d,r,o)   (0xfffff800+((d) << 7)+((r) << 2)+(o))#ifdef __ASSEMBLY__/* * The I/O device range is designed so that it can be addressed via * negative offsets from the zero register, so no explicit base * pointer register is necesary. */#define IODEVV(d,r) IODEVA(d,r,0)(zero)#define IODEVB(d,r) IODEVV(d,r,0)#define IODEVH(d,r) IODEVV(d,r,0)#define IODEVL(d,r) IODEVV(d,r,0)#else#include <stdint.h>/* Writable registers */#define IODEVV(d,r)   (*(volatile void     *)IODEVA(d,r,0))#define IODEVB(d,r)   (*(volatile uint8_t  *)IODEVA(d,r,0))#define IODEVB0(d,r)  (*(volatile uint8_t  *)IODEVA(d,r,0))#define IODEVB1(d,r)  (*(volatile uint8_t  *)IODEVA(d,r,1))#define IODEVB2(d,r)  (*(volatile uint8_t  *)IODEVA(d,r,2))#define IODEVB3(d,r)  (*(volatile uint8_t  *)IODEVA(d,r,3))#define IODEVH(d,r)   (*(volatile uint16_t *)IODEVA(d,r,0))#define IODEVH0(d,r)  (*(volatile uint16_t *)IODEVA(d,r,0))#define IODEVH1(d,r)  (*(volatile uint16_t *)IODEVA(d,r,2))#define IODEVL(d,r)   (*(volatile uint32_t *)IODEVA(d,r,0))/* Readonly registers */#define IODEVRV(d,r)  (*(const volatile void     *)IODEVA(d,r,0))#define IODEVRB(d,r)  (*(const volatile uint8_t  *)IODEVA(d,r,0))#define IODEVRB0(d,r) (*(const volatile uint8_t  *)IODEVA(d,r,0))#define IODEVRB1(d,r) (*(const volatile uint8_t  *)IODEVA(d,r,1))#define IODEVRB2(d,r) (*(const volatile uint8_t  *)IODEVA(d,r,2))#define IODEVRB3(d,r) (*(const volatile uint8_t  *)IODEVA(d,r,3))#define IODEVRH(d,r)  (*(const volatile uint16_t *)IODEVA(d,r,0))#define IODEVRH0(d,r) (*(const volatile uint16_t *)IODEVA(d,r,0))#define IODEVRH1(d,r) (*(const volatile uint16_t *)IODEVA(d,r,2))#define IODEVRL(d,r)  (*(const volatile uint32_t *)IODEVA(d,r,0))#endif#define CPU_HZ		84000000#define LED_DEV		0#define LED		IODEVB(LED_DEV,0)#define RESET_DEV	1#define RESET_CMD	IODEVL(RESET_DEV,0)#define ROMCOPY_DEV	2#define ROMCOPY_DONE	IODEVRL(ROMCOPY_DEV,0)#define CON_DEV		3#define CONSOLE		IODEVB(CON_DEV,0)#define CON_BAUDDIV	IODEVL(CON_DEV,1)#define CON_BAUD_BASE	(CPU_HZ >> 4)#define CON_BAUD_BITS	24#define CON_STATUS	IODEVRL(CON_DEV,2)#define CON_IRQEN	IODEVL(CON_DEV,3)#define SD_DEV		4#define SD_CTL		IODEVL(SD_DEV,0)#define SD_CTL_SPEED	IODEVB0(SD_DEV,0)#define SD_CTL_CLRCRC	IODEVB1(SD_DEV,0)#define SD_CRC7_RD	IODEVRB0(SD_DEV,2)#define SD_CRC16_RD	IODEVRH1(SD_DEV,2)#define SD_CRC7_WR	IODEVRB0(SD_DEV,3)#define SD_CRC16_WR	IODEVRH1(SD_DEV,3)/* Speed values, not including -1 adjustment */#define SD_SLOW		128	/* 328 kHz */#define SD_20MHZ	3	/* Really 14 MHz */#define SD_25MHZ	2	/* Really 21 MHz */#define SD_50MHZ	1	/* Really 42 MHz */#define SYSCLOCK_DEV		5#define SYSCLOCK_DATETIME	IODEVL(SYSCLOCK_DEV,0)#define SYSCLOCK_TICK		IODEVL(SYSCLOCK_DEV,1)#define SYSCLOCK_TICK_HOLD	IODEVH0(SYSCLOCK_DEV,1)#define SYSCLOCK_TICK_NOW	IODEVH1(SYSCLOCK_DEV,1)#endif /* IODEV_H */
 |