diff --git a/booster/include/csr.h b/booster/include/csr.h index e6f0259..c18b102 100644 --- a/booster/include/csr.h +++ b/booster/include/csr.h @@ -1,679 +1,725 @@ +//-------------------------------------------------------------------------------- +// Auto-generated by Migen (ae42105) & LiteX (3a72688b) on 2019-08-23 13:21:26 +//-------------------------------------------------------------------------------- #ifndef __GENERATED_CSR_H #define __GENERATED_CSR_H #include - -static inline void csr_writeb(uint8_t value, uint32_t addr) -{ - *((volatile uint8_t *)addr) = value; -} - -static inline uint8_t csr_readb(uint32_t addr) -{ - return *(volatile uint8_t *)addr; -} - -static inline void csr_writew(uint16_t value, uint32_t addr) -{ - *((volatile uint16_t *)addr) = value; -} - -static inline uint16_t csr_readw(uint32_t addr) -{ - return *(volatile uint16_t *)addr; -} - -static inline void csr_writel(uint32_t value, uint32_t addr) -{ - *((volatile uint32_t *)addr) = value; -} - -static inline uint32_t csr_readl(uint32_t addr) -{ - return *(volatile uint32_t *)addr; -} +#ifdef CSR_ACCESSORS_DEFINED +extern void csr_writeb(uint8_t value, unsigned long addr); +extern uint8_t csr_readb(unsigned long addr); +extern void csr_writew(uint16_t value, unsigned long addr); +extern uint16_t csr_readw(unsigned long addr); +extern void csr_writel(uint32_t value, unsigned long addr); +extern uint32_t csr_readl(unsigned long addr); +#else /* ! CSR_ACCESSORS_DEFINED */ +#include +#endif /* ! CSR_ACCESSORS_DEFINED */ /* ctrl */ -#define CSR_CTRL_BASE 0xe0000000 -#define CSR_CTRL_RESET_ADDR 0xe0000000 +#define CSR_CTRL_BASE 0xe0000000L +#define CSR_CTRL_RESET_ADDR 0xe0000000L #define CSR_CTRL_RESET_SIZE 1 static inline unsigned char ctrl_reset_read(void) { - unsigned char r = csr_readl(0xe0000000); + unsigned char r = csr_readl(0xe0000000L); return r; } static inline void ctrl_reset_write(unsigned char value) { - csr_writel(value, 0xe0000000); + csr_writel(value, 0xe0000000L); } -#define CSR_CTRL_SCRATCH_ADDR 0xe0000004 +#define CSR_CTRL_SCRATCH_ADDR 0xe0000004L #define CSR_CTRL_SCRATCH_SIZE 4 static inline unsigned int ctrl_scratch_read(void) { - unsigned int r = csr_readl(0xe0000004); + unsigned int r = csr_readl(0xe0000004L); r <<= 8; - r |= csr_readl(0xe0000008); + r |= csr_readl(0xe0000008L); r <<= 8; - r |= csr_readl(0xe000000c); + r |= csr_readl(0xe000000cL); r <<= 8; - r |= csr_readl(0xe0000010); + r |= csr_readl(0xe0000010L); return r; } static inline void ctrl_scratch_write(unsigned int value) { - csr_writel(value >> 24, 0xe0000004); - csr_writel(value >> 16, 0xe0000008); - csr_writel(value >> 8, 0xe000000c); - csr_writel(value, 0xe0000010); + csr_writel(value >> 24, 0xe0000004L); + csr_writel(value >> 16, 0xe0000008L); + csr_writel(value >> 8, 0xe000000cL); + csr_writel(value, 0xe0000010L); } -#define CSR_CTRL_BUS_ERRORS_ADDR 0xe0000014 +#define CSR_CTRL_BUS_ERRORS_ADDR 0xe0000014L #define CSR_CTRL_BUS_ERRORS_SIZE 4 static inline unsigned int ctrl_bus_errors_read(void) { - unsigned int r = csr_readl(0xe0000014); + unsigned int r = csr_readl(0xe0000014L); r <<= 8; - r |= csr_readl(0xe0000018); + r |= csr_readl(0xe0000018L); r <<= 8; - r |= csr_readl(0xe000001c); + r |= csr_readl(0xe000001cL); r <<= 8; - r |= csr_readl(0xe0000020); + r |= csr_readl(0xe0000020L); return r; } /* picorvspi */ -#define CSR_PICORVSPI_BASE 0xe0005000 -#define CSR_PICORVSPI_CFG1_ADDR 0xe0005000 +#define CSR_PICORVSPI_BASE 0xe0005000L +#define CSR_PICORVSPI_CFG1_ADDR 0xe0005000L #define CSR_PICORVSPI_CFG1_SIZE 1 static inline unsigned char picorvspi_cfg1_read(void) { - unsigned char r = csr_readl(0xe0005000); + unsigned char r = csr_readl(0xe0005000L); return r; } static inline void picorvspi_cfg1_write(unsigned char value) { - csr_writel(value, 0xe0005000); + csr_writel(value, 0xe0005000L); } -#define CSR_PICORVSPI_CFG2_ADDR 0xe0005004 +#define CSR_PICORVSPI_CFG2_ADDR 0xe0005004L #define CSR_PICORVSPI_CFG2_SIZE 1 static inline unsigned char picorvspi_cfg2_read(void) { - unsigned char r = csr_readl(0xe0005004); + unsigned char r = csr_readl(0xe0005004L); return r; } static inline void picorvspi_cfg2_write(unsigned char value) { - csr_writel(value, 0xe0005004); + csr_writel(value, 0xe0005004L); } -#define CSR_PICORVSPI_CFG3_ADDR 0xe0005008 +#define CSR_PICORVSPI_CFG3_ADDR 0xe0005008L #define CSR_PICORVSPI_CFG3_SIZE 1 static inline unsigned char picorvspi_cfg3_read(void) { - unsigned char r = csr_readl(0xe0005008); + unsigned char r = csr_readl(0xe0005008L); return r; } static inline void picorvspi_cfg3_write(unsigned char value) { - csr_writel(value, 0xe0005008); + csr_writel(value, 0xe0005008L); } -#define CSR_PICORVSPI_CFG4_ADDR 0xe000500c +#define CSR_PICORVSPI_CFG4_ADDR 0xe000500cL #define CSR_PICORVSPI_CFG4_SIZE 1 static inline unsigned char picorvspi_cfg4_read(void) { - unsigned char r = csr_readl(0xe000500c); + unsigned char r = csr_readl(0xe000500cL); return r; } static inline void picorvspi_cfg4_write(unsigned char value) { - csr_writel(value, 0xe000500c); + csr_writel(value, 0xe000500cL); } -#define CSR_PICORVSPI_STAT1_ADDR 0xe0005010 +#define CSR_PICORVSPI_STAT1_ADDR 0xe0005010L #define CSR_PICORVSPI_STAT1_SIZE 1 static inline unsigned char picorvspi_stat1_read(void) { - unsigned char r = csr_readl(0xe0005010); + unsigned char r = csr_readl(0xe0005010L); return r; } -#define CSR_PICORVSPI_STAT2_ADDR 0xe0005014 +#define CSR_PICORVSPI_STAT2_ADDR 0xe0005014L #define CSR_PICORVSPI_STAT2_SIZE 1 static inline unsigned char picorvspi_stat2_read(void) { - unsigned char r = csr_readl(0xe0005014); + unsigned char r = csr_readl(0xe0005014L); return r; } -#define CSR_PICORVSPI_STAT3_ADDR 0xe0005018 +#define CSR_PICORVSPI_STAT3_ADDR 0xe0005018L #define CSR_PICORVSPI_STAT3_SIZE 1 static inline unsigned char picorvspi_stat3_read(void) { - unsigned char r = csr_readl(0xe0005018); + unsigned char r = csr_readl(0xe0005018L); return r; } -#define CSR_PICORVSPI_STAT4_ADDR 0xe000501c +#define CSR_PICORVSPI_STAT4_ADDR 0xe000501cL #define CSR_PICORVSPI_STAT4_SIZE 1 static inline unsigned char picorvspi_stat4_read(void) { - unsigned char r = csr_readl(0xe000501c); + unsigned char r = csr_readl(0xe000501cL); return r; } /* reboot */ -#define CSR_REBOOT_BASE 0xe0006000 -#define CSR_REBOOT_CTRL_ADDR 0xe0006000 +#define CSR_REBOOT_BASE 0xe0006000L +#define CSR_REBOOT_CTRL_ADDR 0xe0006000L #define CSR_REBOOT_CTRL_SIZE 1 static inline unsigned char reboot_ctrl_read(void) { - unsigned char r = csr_readl(0xe0006000); + unsigned char r = csr_readl(0xe0006000L); return r; } static inline void reboot_ctrl_write(unsigned char value) { - csr_writel(value, 0xe0006000); + csr_writel(value, 0xe0006000L); } -#define CSR_REBOOT_ADDR_ADDR 0xe0006004 +#define CSR_REBOOT_ADDR_ADDR 0xe0006004L #define CSR_REBOOT_ADDR_SIZE 4 static inline unsigned int reboot_addr_read(void) { - unsigned int r = csr_readl(0xe0006004); + unsigned int r = csr_readl(0xe0006004L); r <<= 8; - r |= csr_readl(0xe0006008); + r |= csr_readl(0xe0006008L); r <<= 8; - r |= csr_readl(0xe000600c); + r |= csr_readl(0xe000600cL); r <<= 8; - r |= csr_readl(0xe0006010); + r |= csr_readl(0xe0006010L); return r; } static inline void reboot_addr_write(unsigned int value) { - csr_writel(value >> 24, 0xe0006004); - csr_writel(value >> 16, 0xe0006008); - csr_writel(value >> 8, 0xe000600c); - csr_writel(value, 0xe0006010); + csr_writel(value >> 24, 0xe0006004L); + csr_writel(value >> 16, 0xe0006008L); + csr_writel(value >> 8, 0xe000600cL); + csr_writel(value, 0xe0006010L); } /* rgb */ -#define CSR_RGB_BASE 0xe0006800 -#define CSR_RGB_DAT_ADDR 0xe0006800 +#define CSR_RGB_BASE 0xe0006800L +#define CSR_RGB_DAT_ADDR 0xe0006800L #define CSR_RGB_DAT_SIZE 1 static inline unsigned char rgb_dat_read(void) { - unsigned char r = csr_readl(0xe0006800); + unsigned char r = csr_readl(0xe0006800L); return r; } static inline void rgb_dat_write(unsigned char value) { - csr_writel(value, 0xe0006800); + csr_writel(value, 0xe0006800L); } -#define CSR_RGB_ADDR_ADDR 0xe0006804 +#define CSR_RGB_ADDR_ADDR 0xe0006804L #define CSR_RGB_ADDR_SIZE 1 static inline unsigned char rgb_addr_read(void) { - unsigned char r = csr_readl(0xe0006804); + unsigned char r = csr_readl(0xe0006804L); return r; } static inline void rgb_addr_write(unsigned char value) { - csr_writel(value, 0xe0006804); + csr_writel(value, 0xe0006804L); } -#define CSR_RGB_CTRL_ADDR 0xe0006808 +#define CSR_RGB_CTRL_ADDR 0xe0006808L #define CSR_RGB_CTRL_SIZE 1 static inline unsigned char rgb_ctrl_read(void) { - unsigned char r = csr_readl(0xe0006808); + unsigned char r = csr_readl(0xe0006808L); return r; } static inline void rgb_ctrl_write(unsigned char value) { - csr_writel(value, 0xe0006808); + csr_writel(value, 0xe0006808L); +} +#define CSR_RGB_RAW_ADDR 0xe000680cL +#define CSR_RGB_RAW_SIZE 1 +static inline unsigned char rgb_raw_read(void) { + unsigned char r = csr_readl(0xe000680cL); + return r; +} +static inline void rgb_raw_write(unsigned char value) { + csr_writel(value, 0xe000680cL); } /* timer0 */ -#define CSR_TIMER0_BASE 0xe0002800 -#define CSR_TIMER0_LOAD_ADDR 0xe0002800 +#define CSR_TIMER0_BASE 0xe0002800L +#define CSR_TIMER0_LOAD_ADDR 0xe0002800L #define CSR_TIMER0_LOAD_SIZE 4 static inline unsigned int timer0_load_read(void) { - unsigned int r = csr_readl(0xe0002800); + unsigned int r = csr_readl(0xe0002800L); r <<= 8; - r |= csr_readl(0xe0002804); + r |= csr_readl(0xe0002804L); r <<= 8; - r |= csr_readl(0xe0002808); + r |= csr_readl(0xe0002808L); r <<= 8; - r |= csr_readl(0xe000280c); + r |= csr_readl(0xe000280cL); return r; } static inline void timer0_load_write(unsigned int value) { - csr_writel(value >> 24, 0xe0002800); - csr_writel(value >> 16, 0xe0002804); - csr_writel(value >> 8, 0xe0002808); - csr_writel(value, 0xe000280c); + csr_writel(value >> 24, 0xe0002800L); + csr_writel(value >> 16, 0xe0002804L); + csr_writel(value >> 8, 0xe0002808L); + csr_writel(value, 0xe000280cL); } -#define CSR_TIMER0_RELOAD_ADDR 0xe0002810 +#define CSR_TIMER0_RELOAD_ADDR 0xe0002810L #define CSR_TIMER0_RELOAD_SIZE 4 static inline unsigned int timer0_reload_read(void) { - unsigned int r = csr_readl(0xe0002810); + unsigned int r = csr_readl(0xe0002810L); r <<= 8; - r |= csr_readl(0xe0002814); + r |= csr_readl(0xe0002814L); r <<= 8; - r |= csr_readl(0xe0002818); + r |= csr_readl(0xe0002818L); r <<= 8; - r |= csr_readl(0xe000281c); + r |= csr_readl(0xe000281cL); return r; } static inline void timer0_reload_write(unsigned int value) { - csr_writel(value >> 24, 0xe0002810); - csr_writel(value >> 16, 0xe0002814); - csr_writel(value >> 8, 0xe0002818); - csr_writel(value, 0xe000281c); + csr_writel(value >> 24, 0xe0002810L); + csr_writel(value >> 16, 0xe0002814L); + csr_writel(value >> 8, 0xe0002818L); + csr_writel(value, 0xe000281cL); } -#define CSR_TIMER0_EN_ADDR 0xe0002820 +#define CSR_TIMER0_EN_ADDR 0xe0002820L #define CSR_TIMER0_EN_SIZE 1 static inline unsigned char timer0_en_read(void) { - unsigned char r = csr_readl(0xe0002820); + unsigned char r = csr_readl(0xe0002820L); return r; } static inline void timer0_en_write(unsigned char value) { - csr_writel(value, 0xe0002820); + csr_writel(value, 0xe0002820L); } -#define CSR_TIMER0_UPDATE_VALUE_ADDR 0xe0002824 +#define CSR_TIMER0_UPDATE_VALUE_ADDR 0xe0002824L #define CSR_TIMER0_UPDATE_VALUE_SIZE 1 static inline unsigned char timer0_update_value_read(void) { - unsigned char r = csr_readl(0xe0002824); + unsigned char r = csr_readl(0xe0002824L); return r; } static inline void timer0_update_value_write(unsigned char value) { - csr_writel(value, 0xe0002824); + csr_writel(value, 0xe0002824L); } -#define CSR_TIMER0_VALUE_ADDR 0xe0002828 +#define CSR_TIMER0_VALUE_ADDR 0xe0002828L #define CSR_TIMER0_VALUE_SIZE 4 static inline unsigned int timer0_value_read(void) { - unsigned int r = csr_readl(0xe0002828); + unsigned int r = csr_readl(0xe0002828L); r <<= 8; - r |= csr_readl(0xe000282c); + r |= csr_readl(0xe000282cL); r <<= 8; - r |= csr_readl(0xe0002830); + r |= csr_readl(0xe0002830L); r <<= 8; - r |= csr_readl(0xe0002834); + r |= csr_readl(0xe0002834L); return r; } -#define CSR_TIMER0_EV_STATUS_ADDR 0xe0002838 +#define CSR_TIMER0_EV_STATUS_ADDR 0xe0002838L #define CSR_TIMER0_EV_STATUS_SIZE 1 static inline unsigned char timer0_ev_status_read(void) { - unsigned char r = csr_readl(0xe0002838); + unsigned char r = csr_readl(0xe0002838L); return r; } static inline void timer0_ev_status_write(unsigned char value) { - csr_writel(value, 0xe0002838); + csr_writel(value, 0xe0002838L); } -#define CSR_TIMER0_EV_PENDING_ADDR 0xe000283c +#define CSR_TIMER0_EV_PENDING_ADDR 0xe000283cL #define CSR_TIMER0_EV_PENDING_SIZE 1 static inline unsigned char timer0_ev_pending_read(void) { - unsigned char r = csr_readl(0xe000283c); + unsigned char r = csr_readl(0xe000283cL); return r; } static inline void timer0_ev_pending_write(unsigned char value) { - csr_writel(value, 0xe000283c); + csr_writel(value, 0xe000283cL); } -#define CSR_TIMER0_EV_ENABLE_ADDR 0xe0002840 +#define CSR_TIMER0_EV_ENABLE_ADDR 0xe0002840L #define CSR_TIMER0_EV_ENABLE_SIZE 1 static inline unsigned char timer0_ev_enable_read(void) { - unsigned char r = csr_readl(0xe0002840); + unsigned char r = csr_readl(0xe0002840L); return r; } static inline void timer0_ev_enable_write(unsigned char value) { - csr_writel(value, 0xe0002840); + csr_writel(value, 0xe0002840L); } /* touch */ -#define CSR_TOUCH_BASE 0xe0005800 -#define CSR_TOUCH_O_ADDR 0xe0005800 +#define CSR_TOUCH_BASE 0xe0005800L +#define CSR_TOUCH_O_ADDR 0xe0005800L #define CSR_TOUCH_O_SIZE 1 static inline unsigned char touch_o_read(void) { - unsigned char r = csr_readl(0xe0005800); + unsigned char r = csr_readl(0xe0005800L); return r; } static inline void touch_o_write(unsigned char value) { - csr_writel(value, 0xe0005800); + csr_writel(value, 0xe0005800L); } -#define CSR_TOUCH_OE_ADDR 0xe0005804 +#define CSR_TOUCH_OE_ADDR 0xe0005804L #define CSR_TOUCH_OE_SIZE 1 static inline unsigned char touch_oe_read(void) { - unsigned char r = csr_readl(0xe0005804); + unsigned char r = csr_readl(0xe0005804L); return r; } static inline void touch_oe_write(unsigned char value) { - csr_writel(value, 0xe0005804); + csr_writel(value, 0xe0005804L); } -#define CSR_TOUCH_I_ADDR 0xe0005808 +#define CSR_TOUCH_I_ADDR 0xe0005808L #define CSR_TOUCH_I_SIZE 1 static inline unsigned char touch_i_read(void) { - unsigned char r = csr_readl(0xe0005808); + unsigned char r = csr_readl(0xe0005808L); return r; } /* usb */ -#define CSR_USB_BASE 0xe0004800 -#define CSR_USB_PULLUP_OUT_ADDR 0xe0004800 +#define CSR_USB_BASE 0xe0004800L +#define CSR_USB_PULLUP_OUT_ADDR 0xe0004800L #define CSR_USB_PULLUP_OUT_SIZE 1 static inline unsigned char usb_pullup_out_read(void) { - unsigned char r = csr_readl(0xe0004800); + unsigned char r = csr_readl(0xe0004800L); return r; } static inline void usb_pullup_out_write(unsigned char value) { - csr_writel(value, 0xe0004800); + csr_writel(value, 0xe0004800L); } -#define CSR_USB_EP_0_OUT_EV_STATUS_ADDR 0xe0004804 +#define CSR_USB_EP_0_OUT_EV_STATUS_ADDR 0xe0004804L #define CSR_USB_EP_0_OUT_EV_STATUS_SIZE 1 static inline unsigned char usb_ep_0_out_ev_status_read(void) { - unsigned char r = csr_readl(0xe0004804); + unsigned char r = csr_readl(0xe0004804L); return r; } static inline void usb_ep_0_out_ev_status_write(unsigned char value) { - csr_writel(value, 0xe0004804); + csr_writel(value, 0xe0004804L); } -#define CSR_USB_EP_0_OUT_EV_PENDING_ADDR 0xe0004808 +#define CSR_USB_EP_0_OUT_EV_PENDING_ADDR 0xe0004808L #define CSR_USB_EP_0_OUT_EV_PENDING_SIZE 1 static inline unsigned char usb_ep_0_out_ev_pending_read(void) { - unsigned char r = csr_readl(0xe0004808); + unsigned char r = csr_readl(0xe0004808L); return r; } static inline void usb_ep_0_out_ev_pending_write(unsigned char value) { - csr_writel(value, 0xe0004808); + csr_writel(value, 0xe0004808L); } -#define CSR_USB_EP_0_OUT_EV_ENABLE_ADDR 0xe000480c +#define CSR_USB_EP_0_OUT_EV_ENABLE_ADDR 0xe000480cL #define CSR_USB_EP_0_OUT_EV_ENABLE_SIZE 1 static inline unsigned char usb_ep_0_out_ev_enable_read(void) { - unsigned char r = csr_readl(0xe000480c); + unsigned char r = csr_readl(0xe000480cL); return r; } static inline void usb_ep_0_out_ev_enable_write(unsigned char value) { - csr_writel(value, 0xe000480c); + csr_writel(value, 0xe000480cL); } -#define CSR_USB_EP_0_OUT_LAST_TOK_ADDR 0xe0004810 +#define CSR_USB_EP_0_OUT_LAST_TOK_ADDR 0xe0004810L #define CSR_USB_EP_0_OUT_LAST_TOK_SIZE 1 static inline unsigned char usb_ep_0_out_last_tok_read(void) { - unsigned char r = csr_readl(0xe0004810); + unsigned char r = csr_readl(0xe0004810L); return r; } -#define CSR_USB_EP_0_OUT_RESPOND_ADDR 0xe0004814 +#define CSR_USB_EP_0_OUT_RESPOND_ADDR 0xe0004814L #define CSR_USB_EP_0_OUT_RESPOND_SIZE 1 static inline unsigned char usb_ep_0_out_respond_read(void) { - unsigned char r = csr_readl(0xe0004814); + unsigned char r = csr_readl(0xe0004814L); return r; } static inline void usb_ep_0_out_respond_write(unsigned char value) { - csr_writel(value, 0xe0004814); + csr_writel(value, 0xe0004814L); } -#define CSR_USB_EP_0_OUT_DTB_ADDR 0xe0004818 +#define CSR_USB_EP_0_OUT_DTB_ADDR 0xe0004818L #define CSR_USB_EP_0_OUT_DTB_SIZE 1 static inline unsigned char usb_ep_0_out_dtb_read(void) { - unsigned char r = csr_readl(0xe0004818); + unsigned char r = csr_readl(0xe0004818L); return r; } static inline void usb_ep_0_out_dtb_write(unsigned char value) { - csr_writel(value, 0xe0004818); + csr_writel(value, 0xe0004818L); } -#define CSR_USB_EP_0_OUT_OBUF_HEAD_ADDR 0xe000481c +#define CSR_USB_EP_0_OUT_OBUF_HEAD_ADDR 0xe000481cL #define CSR_USB_EP_0_OUT_OBUF_HEAD_SIZE 1 static inline unsigned char usb_ep_0_out_obuf_head_read(void) { - unsigned char r = csr_readl(0xe000481c); + unsigned char r = csr_readl(0xe000481cL); return r; } static inline void usb_ep_0_out_obuf_head_write(unsigned char value) { - csr_writel(value, 0xe000481c); + csr_writel(value, 0xe000481cL); } -#define CSR_USB_EP_0_OUT_OBUF_EMPTY_ADDR 0xe0004820 +#define CSR_USB_EP_0_OUT_OBUF_EMPTY_ADDR 0xe0004820L #define CSR_USB_EP_0_OUT_OBUF_EMPTY_SIZE 1 static inline unsigned char usb_ep_0_out_obuf_empty_read(void) { - unsigned char r = csr_readl(0xe0004820); + unsigned char r = csr_readl(0xe0004820L); return r; } -#define CSR_USB_EP_0_IN_EV_STATUS_ADDR 0xe0004824 +#define CSR_USB_EP_0_IN_EV_STATUS_ADDR 0xe0004824L #define CSR_USB_EP_0_IN_EV_STATUS_SIZE 1 static inline unsigned char usb_ep_0_in_ev_status_read(void) { - unsigned char r = csr_readl(0xe0004824); + unsigned char r = csr_readl(0xe0004824L); return r; } static inline void usb_ep_0_in_ev_status_write(unsigned char value) { - csr_writel(value, 0xe0004824); + csr_writel(value, 0xe0004824L); } -#define CSR_USB_EP_0_IN_EV_PENDING_ADDR 0xe0004828 +#define CSR_USB_EP_0_IN_EV_PENDING_ADDR 0xe0004828L #define CSR_USB_EP_0_IN_EV_PENDING_SIZE 1 static inline unsigned char usb_ep_0_in_ev_pending_read(void) { - unsigned char r = csr_readl(0xe0004828); + unsigned char r = csr_readl(0xe0004828L); return r; } static inline void usb_ep_0_in_ev_pending_write(unsigned char value) { - csr_writel(value, 0xe0004828); + csr_writel(value, 0xe0004828L); } -#define CSR_USB_EP_0_IN_EV_ENABLE_ADDR 0xe000482c +#define CSR_USB_EP_0_IN_EV_ENABLE_ADDR 0xe000482cL #define CSR_USB_EP_0_IN_EV_ENABLE_SIZE 1 static inline unsigned char usb_ep_0_in_ev_enable_read(void) { - unsigned char r = csr_readl(0xe000482c); + unsigned char r = csr_readl(0xe000482cL); return r; } static inline void usb_ep_0_in_ev_enable_write(unsigned char value) { - csr_writel(value, 0xe000482c); + csr_writel(value, 0xe000482cL); } -#define CSR_USB_EP_0_IN_LAST_TOK_ADDR 0xe0004830 +#define CSR_USB_EP_0_IN_LAST_TOK_ADDR 0xe0004830L #define CSR_USB_EP_0_IN_LAST_TOK_SIZE 1 static inline unsigned char usb_ep_0_in_last_tok_read(void) { - unsigned char r = csr_readl(0xe0004830); + unsigned char r = csr_readl(0xe0004830L); return r; } -#define CSR_USB_EP_0_IN_RESPOND_ADDR 0xe0004834 +#define CSR_USB_EP_0_IN_RESPOND_ADDR 0xe0004834L #define CSR_USB_EP_0_IN_RESPOND_SIZE 1 static inline unsigned char usb_ep_0_in_respond_read(void) { - unsigned char r = csr_readl(0xe0004834); + unsigned char r = csr_readl(0xe0004834L); return r; } static inline void usb_ep_0_in_respond_write(unsigned char value) { - csr_writel(value, 0xe0004834); + csr_writel(value, 0xe0004834L); } -#define CSR_USB_EP_0_IN_DTB_ADDR 0xe0004838 +#define CSR_USB_EP_0_IN_DTB_ADDR 0xe0004838L #define CSR_USB_EP_0_IN_DTB_SIZE 1 static inline unsigned char usb_ep_0_in_dtb_read(void) { - unsigned char r = csr_readl(0xe0004838); + unsigned char r = csr_readl(0xe0004838L); return r; } static inline void usb_ep_0_in_dtb_write(unsigned char value) { - csr_writel(value, 0xe0004838); + csr_writel(value, 0xe0004838L); } -#define CSR_USB_EP_0_IN_IBUF_HEAD_ADDR 0xe000483c +#define CSR_USB_EP_0_IN_IBUF_HEAD_ADDR 0xe000483cL #define CSR_USB_EP_0_IN_IBUF_HEAD_SIZE 1 static inline unsigned char usb_ep_0_in_ibuf_head_read(void) { - unsigned char r = csr_readl(0xe000483c); + unsigned char r = csr_readl(0xe000483cL); return r; } static inline void usb_ep_0_in_ibuf_head_write(unsigned char value) { - csr_writel(value, 0xe000483c); + csr_writel(value, 0xe000483cL); } -#define CSR_USB_EP_0_IN_IBUF_EMPTY_ADDR 0xe0004840 +#define CSR_USB_EP_0_IN_IBUF_EMPTY_ADDR 0xe0004840L #define CSR_USB_EP_0_IN_IBUF_EMPTY_SIZE 1 static inline unsigned char usb_ep_0_in_ibuf_empty_read(void) { - unsigned char r = csr_readl(0xe0004840); + unsigned char r = csr_readl(0xe0004840L); return r; } -#define CSR_USB_EP_1_IN_EV_STATUS_ADDR 0xe0004844 +#define CSR_USB_EP_1_IN_EV_STATUS_ADDR 0xe0004844L #define CSR_USB_EP_1_IN_EV_STATUS_SIZE 1 static inline unsigned char usb_ep_1_in_ev_status_read(void) { - unsigned char r = csr_readl(0xe0004844); + unsigned char r = csr_readl(0xe0004844L); return r; } static inline void usb_ep_1_in_ev_status_write(unsigned char value) { - csr_writel(value, 0xe0004844); + csr_writel(value, 0xe0004844L); } -#define CSR_USB_EP_1_IN_EV_PENDING_ADDR 0xe0004848 +#define CSR_USB_EP_1_IN_EV_PENDING_ADDR 0xe0004848L #define CSR_USB_EP_1_IN_EV_PENDING_SIZE 1 static inline unsigned char usb_ep_1_in_ev_pending_read(void) { - unsigned char r = csr_readl(0xe0004848); + unsigned char r = csr_readl(0xe0004848L); return r; } static inline void usb_ep_1_in_ev_pending_write(unsigned char value) { - csr_writel(value, 0xe0004848); + csr_writel(value, 0xe0004848L); } -#define CSR_USB_EP_1_IN_EV_ENABLE_ADDR 0xe000484c +#define CSR_USB_EP_1_IN_EV_ENABLE_ADDR 0xe000484cL #define CSR_USB_EP_1_IN_EV_ENABLE_SIZE 1 static inline unsigned char usb_ep_1_in_ev_enable_read(void) { - unsigned char r = csr_readl(0xe000484c); + unsigned char r = csr_readl(0xe000484cL); return r; } static inline void usb_ep_1_in_ev_enable_write(unsigned char value) { - csr_writel(value, 0xe000484c); + csr_writel(value, 0xe000484cL); } -#define CSR_USB_EP_1_IN_LAST_TOK_ADDR 0xe0004850 +#define CSR_USB_EP_1_IN_LAST_TOK_ADDR 0xe0004850L #define CSR_USB_EP_1_IN_LAST_TOK_SIZE 1 static inline unsigned char usb_ep_1_in_last_tok_read(void) { - unsigned char r = csr_readl(0xe0004850); + unsigned char r = csr_readl(0xe0004850L); return r; } -#define CSR_USB_EP_1_IN_RESPOND_ADDR 0xe0004854 +#define CSR_USB_EP_1_IN_RESPOND_ADDR 0xe0004854L #define CSR_USB_EP_1_IN_RESPOND_SIZE 1 static inline unsigned char usb_ep_1_in_respond_read(void) { - unsigned char r = csr_readl(0xe0004854); + unsigned char r = csr_readl(0xe0004854L); return r; } static inline void usb_ep_1_in_respond_write(unsigned char value) { - csr_writel(value, 0xe0004854); + csr_writel(value, 0xe0004854L); } -#define CSR_USB_EP_1_IN_DTB_ADDR 0xe0004858 +#define CSR_USB_EP_1_IN_DTB_ADDR 0xe0004858L #define CSR_USB_EP_1_IN_DTB_SIZE 1 static inline unsigned char usb_ep_1_in_dtb_read(void) { - unsigned char r = csr_readl(0xe0004858); + unsigned char r = csr_readl(0xe0004858L); return r; } static inline void usb_ep_1_in_dtb_write(unsigned char value) { - csr_writel(value, 0xe0004858); + csr_writel(value, 0xe0004858L); } -#define CSR_USB_EP_1_IN_IBUF_HEAD_ADDR 0xe000485c +#define CSR_USB_EP_1_IN_IBUF_HEAD_ADDR 0xe000485cL #define CSR_USB_EP_1_IN_IBUF_HEAD_SIZE 1 static inline unsigned char usb_ep_1_in_ibuf_head_read(void) { - unsigned char r = csr_readl(0xe000485c); + unsigned char r = csr_readl(0xe000485cL); return r; } static inline void usb_ep_1_in_ibuf_head_write(unsigned char value) { - csr_writel(value, 0xe000485c); + csr_writel(value, 0xe000485cL); } -#define CSR_USB_EP_1_IN_IBUF_EMPTY_ADDR 0xe0004860 +#define CSR_USB_EP_1_IN_IBUF_EMPTY_ADDR 0xe0004860L #define CSR_USB_EP_1_IN_IBUF_EMPTY_SIZE 1 static inline unsigned char usb_ep_1_in_ibuf_empty_read(void) { - unsigned char r = csr_readl(0xe0004860); + unsigned char r = csr_readl(0xe0004860L); return r; } -#define CSR_USB_EP_2_OUT_EV_STATUS_ADDR 0xe0004864 +#define CSR_USB_EP_2_OUT_EV_STATUS_ADDR 0xe0004864L #define CSR_USB_EP_2_OUT_EV_STATUS_SIZE 1 static inline unsigned char usb_ep_2_out_ev_status_read(void) { - unsigned char r = csr_readl(0xe0004864); + unsigned char r = csr_readl(0xe0004864L); return r; } static inline void usb_ep_2_out_ev_status_write(unsigned char value) { - csr_writel(value, 0xe0004864); + csr_writel(value, 0xe0004864L); } -#define CSR_USB_EP_2_OUT_EV_PENDING_ADDR 0xe0004868 +#define CSR_USB_EP_2_OUT_EV_PENDING_ADDR 0xe0004868L #define CSR_USB_EP_2_OUT_EV_PENDING_SIZE 1 static inline unsigned char usb_ep_2_out_ev_pending_read(void) { - unsigned char r = csr_readl(0xe0004868); + unsigned char r = csr_readl(0xe0004868L); return r; } static inline void usb_ep_2_out_ev_pending_write(unsigned char value) { - csr_writel(value, 0xe0004868); + csr_writel(value, 0xe0004868L); } -#define CSR_USB_EP_2_OUT_EV_ENABLE_ADDR 0xe000486c +#define CSR_USB_EP_2_OUT_EV_ENABLE_ADDR 0xe000486cL #define CSR_USB_EP_2_OUT_EV_ENABLE_SIZE 1 static inline unsigned char usb_ep_2_out_ev_enable_read(void) { - unsigned char r = csr_readl(0xe000486c); + unsigned char r = csr_readl(0xe000486cL); return r; } static inline void usb_ep_2_out_ev_enable_write(unsigned char value) { - csr_writel(value, 0xe000486c); + csr_writel(value, 0xe000486cL); } -#define CSR_USB_EP_2_OUT_LAST_TOK_ADDR 0xe0004870 +#define CSR_USB_EP_2_OUT_LAST_TOK_ADDR 0xe0004870L #define CSR_USB_EP_2_OUT_LAST_TOK_SIZE 1 static inline unsigned char usb_ep_2_out_last_tok_read(void) { - unsigned char r = csr_readl(0xe0004870); + unsigned char r = csr_readl(0xe0004870L); return r; } -#define CSR_USB_EP_2_OUT_RESPOND_ADDR 0xe0004874 +#define CSR_USB_EP_2_OUT_RESPOND_ADDR 0xe0004874L #define CSR_USB_EP_2_OUT_RESPOND_SIZE 1 static inline unsigned char usb_ep_2_out_respond_read(void) { - unsigned char r = csr_readl(0xe0004874); + unsigned char r = csr_readl(0xe0004874L); return r; } static inline void usb_ep_2_out_respond_write(unsigned char value) { - csr_writel(value, 0xe0004874); + csr_writel(value, 0xe0004874L); } -#define CSR_USB_EP_2_OUT_DTB_ADDR 0xe0004878 +#define CSR_USB_EP_2_OUT_DTB_ADDR 0xe0004878L #define CSR_USB_EP_2_OUT_DTB_SIZE 1 static inline unsigned char usb_ep_2_out_dtb_read(void) { - unsigned char r = csr_readl(0xe0004878); + unsigned char r = csr_readl(0xe0004878L); return r; } static inline void usb_ep_2_out_dtb_write(unsigned char value) { - csr_writel(value, 0xe0004878); + csr_writel(value, 0xe0004878L); } -#define CSR_USB_EP_2_OUT_OBUF_HEAD_ADDR 0xe000487c +#define CSR_USB_EP_2_OUT_OBUF_HEAD_ADDR 0xe000487cL #define CSR_USB_EP_2_OUT_OBUF_HEAD_SIZE 1 static inline unsigned char usb_ep_2_out_obuf_head_read(void) { - unsigned char r = csr_readl(0xe000487c); + unsigned char r = csr_readl(0xe000487cL); return r; } static inline void usb_ep_2_out_obuf_head_write(unsigned char value) { - csr_writel(value, 0xe000487c); + csr_writel(value, 0xe000487cL); } -#define CSR_USB_EP_2_OUT_OBUF_EMPTY_ADDR 0xe0004880 +#define CSR_USB_EP_2_OUT_OBUF_EMPTY_ADDR 0xe0004880L #define CSR_USB_EP_2_OUT_OBUF_EMPTY_SIZE 1 static inline unsigned char usb_ep_2_out_obuf_empty_read(void) { - unsigned char r = csr_readl(0xe0004880); + unsigned char r = csr_readl(0xe0004880L); return r; } -#define CSR_USB_EP_2_IN_EV_STATUS_ADDR 0xe0004884 +#define CSR_USB_EP_2_IN_EV_STATUS_ADDR 0xe0004884L #define CSR_USB_EP_2_IN_EV_STATUS_SIZE 1 static inline unsigned char usb_ep_2_in_ev_status_read(void) { - unsigned char r = csr_readl(0xe0004884); + unsigned char r = csr_readl(0xe0004884L); return r; } static inline void usb_ep_2_in_ev_status_write(unsigned char value) { - csr_writel(value, 0xe0004884); + csr_writel(value, 0xe0004884L); } -#define CSR_USB_EP_2_IN_EV_PENDING_ADDR 0xe0004888 +#define CSR_USB_EP_2_IN_EV_PENDING_ADDR 0xe0004888L #define CSR_USB_EP_2_IN_EV_PENDING_SIZE 1 static inline unsigned char usb_ep_2_in_ev_pending_read(void) { - unsigned char r = csr_readl(0xe0004888); + unsigned char r = csr_readl(0xe0004888L); return r; } static inline void usb_ep_2_in_ev_pending_write(unsigned char value) { - csr_writel(value, 0xe0004888); + csr_writel(value, 0xe0004888L); } -#define CSR_USB_EP_2_IN_EV_ENABLE_ADDR 0xe000488c +#define CSR_USB_EP_2_IN_EV_ENABLE_ADDR 0xe000488cL #define CSR_USB_EP_2_IN_EV_ENABLE_SIZE 1 static inline unsigned char usb_ep_2_in_ev_enable_read(void) { - unsigned char r = csr_readl(0xe000488c); + unsigned char r = csr_readl(0xe000488cL); return r; } static inline void usb_ep_2_in_ev_enable_write(unsigned char value) { - csr_writel(value, 0xe000488c); + csr_writel(value, 0xe000488cL); } -#define CSR_USB_EP_2_IN_LAST_TOK_ADDR 0xe0004890 +#define CSR_USB_EP_2_IN_LAST_TOK_ADDR 0xe0004890L #define CSR_USB_EP_2_IN_LAST_TOK_SIZE 1 static inline unsigned char usb_ep_2_in_last_tok_read(void) { - unsigned char r = csr_readl(0xe0004890); + unsigned char r = csr_readl(0xe0004890L); return r; } -#define CSR_USB_EP_2_IN_RESPOND_ADDR 0xe0004894 +#define CSR_USB_EP_2_IN_RESPOND_ADDR 0xe0004894L #define CSR_USB_EP_2_IN_RESPOND_SIZE 1 static inline unsigned char usb_ep_2_in_respond_read(void) { - unsigned char r = csr_readl(0xe0004894); + unsigned char r = csr_readl(0xe0004894L); return r; } static inline void usb_ep_2_in_respond_write(unsigned char value) { - csr_writel(value, 0xe0004894); + csr_writel(value, 0xe0004894L); } -#define CSR_USB_EP_2_IN_DTB_ADDR 0xe0004898 +#define CSR_USB_EP_2_IN_DTB_ADDR 0xe0004898L #define CSR_USB_EP_2_IN_DTB_SIZE 1 static inline unsigned char usb_ep_2_in_dtb_read(void) { - unsigned char r = csr_readl(0xe0004898); + unsigned char r = csr_readl(0xe0004898L); return r; } static inline void usb_ep_2_in_dtb_write(unsigned char value) { - csr_writel(value, 0xe0004898); + csr_writel(value, 0xe0004898L); } -#define CSR_USB_EP_2_IN_IBUF_HEAD_ADDR 0xe000489c +#define CSR_USB_EP_2_IN_IBUF_HEAD_ADDR 0xe000489cL #define CSR_USB_EP_2_IN_IBUF_HEAD_SIZE 1 static inline unsigned char usb_ep_2_in_ibuf_head_read(void) { - unsigned char r = csr_readl(0xe000489c); + unsigned char r = csr_readl(0xe000489cL); return r; } static inline void usb_ep_2_in_ibuf_head_write(unsigned char value) { - csr_writel(value, 0xe000489c); + csr_writel(value, 0xe000489cL); } -#define CSR_USB_EP_2_IN_IBUF_EMPTY_ADDR 0xe00048a0 +#define CSR_USB_EP_2_IN_IBUF_EMPTY_ADDR 0xe00048a0L #define CSR_USB_EP_2_IN_IBUF_EMPTY_SIZE 1 static inline unsigned char usb_ep_2_in_ibuf_empty_read(void) { - unsigned char r = csr_readl(0xe00048a0); + unsigned char r = csr_readl(0xe00048a0L); + return r; +} +#define CSR_USB_ADDRESS_ADDR 0xe00048a4L +#define CSR_USB_ADDRESS_SIZE 1 +static inline unsigned char usb_address_read(void) { + unsigned char r = csr_readl(0xe00048a4L); + return r; +} +static inline void usb_address_write(unsigned char value) { + csr_writel(value, 0xe00048a4L); +} + +/* version */ +#define CSR_VERSION_BASE 0xe0007000L +#define CSR_VERSION_MAJOR_ADDR 0xe0007000L +#define CSR_VERSION_MAJOR_SIZE 1 +static inline unsigned char version_major_read(void) { + unsigned char r = csr_readl(0xe0007000L); + return r; +} +#define CSR_VERSION_MINOR_ADDR 0xe0007004L +#define CSR_VERSION_MINOR_SIZE 1 +static inline unsigned char version_minor_read(void) { + unsigned char r = csr_readl(0xe0007004L); + return r; +} +#define CSR_VERSION_REVISION_ADDR 0xe0007008L +#define CSR_VERSION_REVISION_SIZE 1 +static inline unsigned char version_revision_read(void) { + unsigned char r = csr_readl(0xe0007008L); + return r; +} +#define CSR_VERSION_GITREV_ADDR 0xe000700cL +#define CSR_VERSION_GITREV_SIZE 4 +static inline unsigned int version_gitrev_read(void) { + unsigned int r = csr_readl(0xe000700cL); + r <<= 8; + r |= csr_readl(0xe0007010L); + r <<= 8; + r |= csr_readl(0xe0007014L); + r <<= 8; + r |= csr_readl(0xe0007018L); + return r; +} +#define CSR_VERSION_GITEXTRA_ADDR 0xe000701cL +#define CSR_VERSION_GITEXTRA_SIZE 2 +static inline unsigned short int version_gitextra_read(void) { + unsigned short int r = csr_readl(0xe000701cL); + r <<= 8; + r |= csr_readl(0xe0007020L); + return r; +} +#define CSR_VERSION_DIRTY_ADDR 0xe0007024L +#define CSR_VERSION_DIRTY_SIZE 1 +static inline unsigned char version_dirty_read(void) { + unsigned char r = csr_readl(0xe0007024L); + return r; +} +#define CSR_VERSION_MODEL_ADDR 0xe0007028L +#define CSR_VERSION_MODEL_SIZE 1 +static inline unsigned char version_model_read(void) { + unsigned char r = csr_readl(0xe0007028L); return r; } /* constants */ -#define NMI_INTERRUPT 0 -static inline int nmi_interrupt_read(void) { - return 0; -} -#define TIMER0_INTERRUPT 1 +#define TIMER0_INTERRUPT 0 static inline int timer0_interrupt_read(void) { - return 1; -} -#define UART_INTERRUPT 2 -static inline int uart_interrupt_read(void) { - return 2; + return 0; } #define USB_INTERRUPT 3 static inline int usb_interrupt_read(void) { @@ -687,6 +733,14 @@ static inline int csr_data_width_read(void) { static inline int system_clock_frequency_read(void) { return 12000000; } +#define CONFIG_BITSTREAM_SYNC_HEADER1 2123999870 +static inline int config_bitstream_sync_header1_read(void) { + return 2123999870; +} +#define CONFIG_BITSTREAM_SYNC_HEADER2 2125109630 +static inline int config_bitstream_sync_header2_read(void) { + return 2125109630; +} #define CONFIG_CLOCK_FREQUENCY 12000000 static inline int config_clock_frequency_read(void) { return 12000000; @@ -707,5 +761,13 @@ static inline const char * config_cpu_variant_read(void) { static inline int config_csr_data_width_read(void) { return 8; } +#define CONFIG_FOMU_REV "HACKER" +static inline const char * config_fomu_rev_read(void) { + return "HACKER"; +} +#define CONFIG_FOMU_REV_HACKER 1 +static inline int config_fomu_rev_hacker_read(void) { + return 1; +} #endif diff --git a/booster/include/csr_accessors.h b/booster/include/csr_accessors.h new file mode 100644 index 0000000..2cd48bd --- /dev/null +++ b/booster/include/csr_accessors.h @@ -0,0 +1,33 @@ +#ifndef CSR_ACCESSORS_DEFINED +#define CSR_ACCESSORS_DEFINED +#include +static inline void csr_writeb(uint8_t value, uint32_t addr) +{ + *((volatile uint8_t *)addr) = value; +} + +static inline uint8_t csr_readb(uint32_t addr) +{ + return *(volatile uint8_t *)addr; +} + +static inline void csr_writew(uint16_t value, uint32_t addr) +{ + *((volatile uint16_t *)addr) = value; +} + +static inline uint16_t csr_readw(uint32_t addr) +{ + return *(volatile uint16_t *)addr; +} + +static inline void csr_writel(uint32_t value, uint32_t addr) +{ + *((volatile uint32_t *)addr) = value; +} + +static inline uint32_t csr_readl(uint32_t addr) +{ + return *(volatile uint32_t *)addr; +} +#endif /* CSR_ACCESSORS_DEFINED */ diff --git a/booster/include/usb.h b/booster/include/usb.h index 632823d..8902e84 100644 --- a/booster/include/usb.h +++ b/booster/include/usb.h @@ -15,6 +15,7 @@ void usb_connect(void); void usb_idle(void); void usb_disconnect(void); void usb_setup(const struct usb_setup_request *setup, uint32_t size); +void usb_set_address(uint8_t); void usb_ack_in(void); void usb_ack_out(void); @@ -25,4 +26,4 @@ void usb_send(const void *data, int total_count); } #endif -#endif \ No newline at end of file +#endif diff --git a/booster/ld/linker.ld b/booster/ld/linker.ld index 2c50637..0f693cd 100644 --- a/booster/ld/linker.ld +++ b/booster/ld/linker.ld @@ -54,7 +54,7 @@ SECTIONS _edata = ALIGN(16); /* Make sure _edata is >= _gp. */ } > sram - booster_data = ADDR(.data) + SIZEOF(.data); +/* booster_data = ADDR(.data) + SIZEOF(.data); */ booster_src = ADDR(.startup) + SIZEOF(.startup) + SIZEOF(.data); } diff --git a/booster/src/main.c b/booster/src/main.c index a7f2f99..7948261 100644 --- a/booster/src/main.c +++ b/booster/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -13,7 +14,7 @@ extern uint32_t hash_length; extern uint32_t image_seed; extern uint32_t spi_id; -extern struct booster_data booster_data; +extern struct booster_data booster_src; uint32_t read_spi_id; uint32_t cached_image_length; uint32_t cached_spi_id; @@ -165,7 +166,7 @@ __attribute__((noreturn)) void fobooster_main(void) // Ensure the hash matches what's expected. calculated_hash = XXH32((const void *)0x20040000, hash_length, image_seed); - if (calculated_hash != booster_data.xxhash) + if (calculated_hash != booster_src.xxhash) { error(HASH_MISMATCH); } @@ -182,22 +183,23 @@ __attribute__((noreturn)) void fobooster_main(void) } } - // Patch the target image so that it goes to our program if the user - // reboots. - ((uint8_t *)cached_image)[9] = 0x04; - // Now that everything is copied to RAM, disable memory-mapped SPI mode. // This puts the SPI into bit-banged mode, which allows us to write to it. cached_spi_id = spi_id; // Copy spi_id over first, since it is still on the flash. cached_image_length = image_length; + // Ensure the cached image matches the image on disk. int i; for (i = 0; i < cached_image_length; i++) { - if (((uint8_t *)cached_image)[i] != ((uint8_t *)0x20000000)[i]) { + if (((uint8_t *)cached_image)[i] != ((uint8_t *)0x20040000)[i]) { error(FINAL_IMAGE_MISMATCH); } } + // Patch the target image so that it goes to our program if the user + // reboots. + ((uint8_t *)cached_image)[9] = 0x04; + picorvspi_cfg4_write(0); ftfl_busy_wait(); @@ -260,4 +262,4 @@ __attribute__((noreturn)) void fobooster_main(void) rgb_mode_writing(); finish_flashing(); -} \ No newline at end of file +} diff --git a/booster/src/rgb.c b/booster/src/rgb.c index 1ac7f1e..3b6967f 100644 --- a/booster/src/rgb.c +++ b/booster/src/rgb.c @@ -1,3 +1,4 @@ +#include #include enum led_registers @@ -120,4 +121,4 @@ void rgb_init(void) rgb_write((12000000 / 2048000) - 1, LEDDBR); rgb_mode_writing(); -} \ No newline at end of file +} diff --git a/booster/src/spi.c b/booster/src/spi.c index cb5122b..0363130 100644 --- a/booster/src/spi.c +++ b/booster/src/spi.c @@ -1,4 +1,5 @@ #include +#include #include #define SP_MOSI_PIN 0 @@ -166,4 +167,4 @@ uint32_t spiId(void) { spiEnd(); return id; -} \ No newline at end of file +} diff --git a/booster/src/usb-dev.c b/booster/src/usb-dev.c index dcab322..e1ea341 100644 --- a/booster/src/usb-dev.c +++ b/booster/src/usb-dev.c @@ -68,6 +68,7 @@ static const uint8_t usb_string_microsoft[18] = { static uint8_t reply_buffer[8]; static uint8_t usb_configuration = 0; +__attribute__((section(".ramtext"))) void usb_setup(const struct usb_setup_request *setup, uint32_t size) { const uint8_t *data = NULL; @@ -77,6 +78,9 @@ void usb_setup(const struct usb_setup_request *setup, uint32_t size) switch (setup->wRequestAndType) { case 0x0500: // SET_ADDRESS + usb_set_address(setup->wValue); + break; + case 0x0b01: // SET_INTERFACE break; diff --git a/booster/src/usb-epfifo.c b/booster/src/usb-epfifo.c index cce0d31..39b18a2 100644 --- a/booster/src/usb-epfifo.c +++ b/booster/src/usb-epfifo.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -21,6 +22,9 @@ static volatile int data_offset; static volatile int data_to_send; static int next_packet_is_empty; +static uint8_t new_address; +static int have_new_address; + // Note that our PIDs are only bits 2 and 3 of the token, // since all other bits are effectively redundant at this point. enum USB_PID { @@ -40,6 +44,11 @@ enum epfifo_response { #define USB_EV_ERROR 1 #define USB_EV_PACKET 2 +void usb_set_address(uint8_t address) { + new_address = address; + have_new_address = 1; +} + void usb_idle(void) { usb_ep_0_out_ev_enable_write(0); usb_ep_0_in_ev_enable_write(0); @@ -58,6 +67,7 @@ void usb_disconnect(void) { usb_ep_0_in_ev_enable_write(0); irq_setmask(irq_getmask() & ~(1 << USB_INTERRUPT)); usb_pullup_out_write(0); + usb_address_write(0); } void usb_connect(void) { @@ -81,7 +91,7 @@ void usb_connect(void) { void usb_init(void) { usb_ep0out_wr_ptr = 0; usb_ep0out_rd_ptr = 0; - usb_pullup_out_write(0); + usb_disconnect(); } static void process_tx(void) { @@ -169,15 +179,23 @@ void usb_isr(void) { } } - if (obuf_len >= 2) - obuf_len -= 2 /* Strip off CRC16 */; +// if (obuf_len >= 2) +// obuf_len -= 2 /* Strip off CRC16 */; - if (last_tok == USB_PID_SETUP) { +// if (last_tok == USB_PID_SETUP) { + if (obuf_len >= 8) { + // HACK: There's no inter-packet indicator, so sometimes we + // receive an ACK packet at the start of our SETUP packet. + // To work around this, assume that all SETUP packets are 10- + // bytes (8 bytes plus CRC16) and work backwards from the end + // of the buffer. + uint32_t setup_pkt[2]; + memcpy(setup_pkt, obuf + obuf_len - 10, 8); usb_ep_0_in_dtb_write(1); data_offset = 0; current_length = 0; current_data = NULL; - usb_setup((const void *)obuf, obuf_len); + usb_setup((const void *)setup_pkt, 8); } usb_ep_0_out_ev_pending_write(ep0o_pending); @@ -188,6 +206,10 @@ void usb_isr(void) { if (ep0i_pending) { usb_ep_0_in_respond_write(EPF_NAK); usb_ep_0_in_ev_pending_write(ep0i_pending); + if (have_new_address) { + have_new_address = 0; + usb_address_write(new_address); + } } return; @@ -234,4 +256,4 @@ int usb_recv(void *buffer, unsigned int buffer_len) { return 0; } -#endif /* CSR_USB_EP_0_OUT_EV_PENDING_ADDR */ \ No newline at end of file +#endif /* CSR_USB_EP_0_OUT_EV_PENDING_ADDR */