crashtest-r0ket/firmware/usb/usbmsc.c

102 lines
3.3 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|=USB_MSC_ENABLEFLAG;
}
#if CFG_USBMSC
void USB_IRQHandler() {
(*rom)->pUSBD->isr();
}
#endif
void usbMSCOff(void) {
(*rom)->pUSBD->connect(false); /* USB Disconnect */
usbMSCenabled&=~USB_MSC_ENABLEFLAG;
}