1 #include "core/rom_drivers.h"
2 #include "core/gpio/gpio.h"
3 #include "dataflash/at45db041d.h"
9 MSC_DEVICE_INFO
const MscDevInfo
= {
10 .idVendor
= USB_VENDOR_ID
,
11 .idProduct
= USB_PROD_ID
,
12 .bcdDevice
= USB_DEVICE
,
13 .StrDescPtr
= (uint32_t)&USB_MSCStringDescriptor
[0],
14 .MSCInquiryStr
= (uint32_t)&"Hackover-Badge DataFlash ", // 28 char response to SCSI INQUIRY
17 .MemorySize
= 1024*512,
18 .MSC_Write
= &usbMSCWrite
,
19 .MSC_Read
= &usbMSCRead
,
22 USB_DEV_INFO
const DeviceInfo
= {
23 .DevType
= USB_DEVICE_CLASS_STORAGE
,
24 .DevDetailPtr
= (uint32_t)&MscDevInfo
27 ROM
**const rom
= (ROM
**)0x1fff1ff8;
30 void usbMSCWrite(uint32_t offset
, uint8_t src
[], uint32_t length
) {
31 dataflash_random_write(src
, offset
, length
);
34 void usbMSCRead(uint32_t offset
, uint8_t dst
[], uint32_t length
) {
35 dataflash_random_read(dst
, offset
, length
);
38 void usbMSCInit(void) {
39 dataflash_initialize();
42 SCB_PDRUNCFG
&= ~(SCB_PDSLEEPCFG_USBPAD_PD
); // Power-up USB PHY
43 SCB_PDRUNCFG
&= ~(SCB_PDSLEEPCFG_USBPLL_PD
); // Power-up USB PLL
45 SCB_USBPLLCLKSEL
= SCB_USBPLLCLKSEL_SOURCE_MAINOSC
; // Select PLL Input
46 SCB_USBPLLCLKUEN
= SCB_USBPLLCLKUEN_UPDATE
; // Update Clock Source
47 SCB_USBPLLCLKUEN
= SCB_USBPLLCLKUEN_DISABLE
; // Toggle Update Register
48 SCB_USBPLLCLKUEN
= SCB_USBPLLCLKUEN_UPDATE
;
50 // Wait until the USB clock is updated
51 while (!(SCB_USBPLLCLKUEN
& SCB_USBPLLCLKUEN_UPDATE
));
53 // Set USB clock to 48MHz (12MHz x 4)
54 SCB_USBPLLCTRL
= (SCB_USBPLLCTRL_MULT_4
);
55 while (!(SCB_USBPLLSTAT
& SCB_USBPLLSTAT_LOCK
)); // Wait Until PLL Locked
56 SCB_USBCLKSEL
= SCB_USBCLKSEL_SOURCE_USBPLLOUT
;
58 // Set USB pin functions
59 // bsx says, its only needed for usb-hid. And it conflicts with btn_0
60 // IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK;
61 // IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT; // CLK OUT
62 IOCON_PIO0_3
&= ~IOCON_PIO0_3_FUNC_MASK
;
63 IOCON_PIO0_3
|= IOCON_PIO0_3_FUNC_USB_VBUS
; // VBus
64 IOCON_PIO0_6
&= ~IOCON_PIO0_6_FUNC_MASK
;
65 IOCON_PIO0_6
|= IOCON_PIO0_6_FUNC_USB_CONNECT
; // Soft Connect
67 // Disable internal resistor on VBUS (0.3)
68 gpioSetPullup(&IOCON_PIO0_3
, gpioPullupMode_Inactive
);
70 // workaround for long connect delay
71 *((uint32_t *)(0x10000054)) = 0x0;
76 /* Enable Timer32_1, IOCON, and USB blocks (for USB ROM driver) */
77 SCB_SYSAHBCLKCTRL
|= (SCB_SYSAHBCLKCTRL_CT32B1
| SCB_SYSAHBCLKCTRL_IOCON
| SCB_SYSAHBCLKCTRL_USB_REG
);
79 /* Use pll and pin init function in rom */
80 /* Warning: This will also set the system clock to 48MHz! */
81 // (*rom)->pUSBD->init_clk_pins();
83 /* insert a delay between clk init and usb init */
84 for (n
= 0; n
< 75; n
++) {__asm("nop");}
86 (*rom
)->pUSBD
->init(&DeviceInfo
); /* USB Initialization */
87 (*rom
)->pUSBD
->connect(true); /* USB Connect */
88 usbMSCenabled
|=USB_MSC_ENABLEFLAG
;
92 void USB_IRQHandler() {
97 void usbMSCOff(void) {
98 (*rom
)->pUSBD
->connect(false); /* USB Disconnect */
99 usbMSCenabled
&=~USB_MSC_ENABLEFLAG
;