102 lines
3.2 KiB
C
102 lines
3.2 KiB
C
#include "core/rom_drivers.h"
|
|
#include "core/gpio/gpio.h"
|
|
#include "filesystem/at45db041d.h"
|
|
|
|
#include "lcd/render.h"
|
|
#include "lcd/display.h"
|
|
|
|
#include "usb.h"
|
|
#include "usbconfig.h"
|
|
#include "usbmsc.h"
|
|
|
|
USB_DEV_INFO DeviceInfo;
|
|
MSC_DEVICE_INFO MscDevInfo;
|
|
ROM ** rom = (ROM **)0x1fff1ff8;
|
|
char usbMSCenabled=0;
|
|
|
|
void usbMSCWrite(uint32_t offset, uint8_t src[], uint32_t length) {
|
|
dataflash_random_write(src, offset, length);
|
|
}
|
|
|
|
void usbMSCRead(uint32_t offset, uint8_t dst[], uint32_t length) {
|
|
dataflash_random_read(dst, offset, length);
|
|
}
|
|
|
|
void usbMSCInit(void) {
|
|
dataflash_initialize();
|
|
|
|
// Setup USB clock
|
|
SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPAD_PD); // Power-up USB PHY
|
|
SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPLL_PD); // Power-up USB PLL
|
|
|
|
SCB_USBPLLCLKSEL = SCB_USBPLLCLKSEL_SOURCE_MAINOSC; // Select PLL Input
|
|
SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE; // Update Clock Source
|
|
SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_DISABLE; // Toggle Update Register
|
|
SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE;
|
|
|
|
// Wait until the USB clock is updated
|
|
while (!(SCB_USBPLLCLKUEN & SCB_USBPLLCLKUEN_UPDATE));
|
|
|
|
// Set USB clock to 48MHz (12MHz x 4)
|
|
SCB_USBPLLCTRL = (SCB_USBPLLCTRL_MULT_4);
|
|
while (!(SCB_USBPLLSTAT & SCB_USBPLLSTAT_LOCK)); // Wait Until PLL Locked
|
|
SCB_USBCLKSEL = SCB_USBCLKSEL_SOURCE_USBPLLOUT;
|
|
|
|
// Set USB pin functions
|
|
// bsx says, its only needed for usb-hid. And it conflicts with btn_0
|
|
// IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK;
|
|
// IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT; // CLK OUT
|
|
IOCON_PIO0_3 &= ~IOCON_PIO0_3_FUNC_MASK;
|
|
IOCON_PIO0_3 |= IOCON_PIO0_3_FUNC_USB_VBUS; // VBus
|
|
IOCON_PIO0_6 &= ~IOCON_PIO0_6_FUNC_MASK;
|
|
IOCON_PIO0_6 |= IOCON_PIO0_6_FUNC_USB_CONNECT; // Soft Connect
|
|
|
|
// Disable internal resistor on VBUS (0.3)
|
|
gpioSetPullup(&IOCON_PIO0_3, gpioPullupMode_Inactive);
|
|
|
|
// workaround for long connect delay
|
|
*((uint32_t *)(0x10000054)) = 0x0;
|
|
|
|
// HID Device Info
|
|
volatile int n;
|
|
MscDevInfo.idVendor = USB_VENDOR_ID;
|
|
MscDevInfo.idProduct = USB_PROD_ID;
|
|
MscDevInfo.bcdDevice = USB_DEVICE;
|
|
MscDevInfo.StrDescPtr = (uint32_t)&USB_MSCStringDescriptor[0];
|
|
MscDevInfo.MSCInquiryStr = (uint32_t)&"r0ket DataFlash "; // 28 char response to SCSI INQUIRY
|
|
MscDevInfo.BlockCount = 1024;
|
|
MscDevInfo.BlockSize = 512;
|
|
MscDevInfo.MemorySize = 1024*512;
|
|
MscDevInfo.MSC_Write = &usbMSCWrite;
|
|
MscDevInfo.MSC_Read = &usbMSCRead;
|
|
|
|
DeviceInfo.DevType = USB_DEVICE_CLASS_STORAGE;
|
|
DeviceInfo.DevDetailPtr = (uint32_t)&MscDevInfo;
|
|
|
|
/* Enable Timer32_1, IOCON, and USB blocks (for USB ROM driver) */
|
|
SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT32B1 | SCB_SYSAHBCLKCTRL_IOCON | SCB_SYSAHBCLKCTRL_USB_REG);
|
|
|
|
/* Use pll and pin init function in rom */
|
|
/* Warning: This will also set the system clock to 48MHz! */
|
|
// (*rom)->pUSBD->init_clk_pins();
|
|
|
|
/* insert a delay between clk init and usb init */
|
|
for (n = 0; n < 75; n++) {__asm("nop");}
|
|
|
|
(*rom)->pUSBD->init(&DeviceInfo); /* USB Initialization */
|
|
(*rom)->pUSBD->connect(true); /* USB Connect */
|
|
usbMSCenabled=1;
|
|
}
|
|
|
|
#if CFG_USBMSC
|
|
void USB_IRQHandler() {
|
|
(*rom)->pUSBD->isr();
|
|
}
|
|
#endif
|
|
|
|
void usbMSCOff(void) {
|
|
(*rom)->pUSBD->connect(false); /* USB Disconnect */
|
|
usbMSCenabled=0;
|
|
}
|
|
|