Fahrplan: Finale Version.
[hackover2013-badge-firmware.git] / core / usbhid-rom / usbmsc.c
1 #include "core/rom_drivers.h"
2 #include "core/gpio/gpio.h"
3 #include "dataflash/at45db041d.h"
4
5 #include "usb.h"
6 #include "usbconfig.h"
7 #include "usbmsc.h"
8
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
15 .BlockCount = 1024,
16 .BlockSize = 512,
17 .MemorySize = 1024*512,
18 .MSC_Write = &usbMSCWrite,
19 .MSC_Read = &usbMSCRead,
20 };
21
22 USB_DEV_INFO const DeviceInfo = {
23 .DevType = USB_DEVICE_CLASS_STORAGE,
24 .DevDetailPtr = (uint32_t)&MscDevInfo
25 };
26
27 ROM **const rom = (ROM **)0x1fff1ff8;
28 char usbMSCenabled=0;
29
30 void usbMSCWrite(uint32_t offset, uint8_t src[], uint32_t length) {
31 dataflash_random_write(src, offset, length);
32 }
33
34 void usbMSCRead(uint32_t offset, uint8_t dst[], uint32_t length) {
35 dataflash_random_read(dst, offset, length);
36 }
37
38 void usbMSCInit(void) {
39 dataflash_initialize();
40
41 // Setup USB clock
42 SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPAD_PD); // Power-up USB PHY
43 SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPLL_PD); // Power-up USB PLL
44
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;
49
50 // Wait until the USB clock is updated
51 while (!(SCB_USBPLLCLKUEN & SCB_USBPLLCLKUEN_UPDATE));
52
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;
57
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
66
67 // Disable internal resistor on VBUS (0.3)
68 gpioSetPullup(&IOCON_PIO0_3, gpioPullupMode_Inactive);
69
70 // workaround for long connect delay
71 *((uint32_t *)(0x10000054)) = 0x0;
72
73 // HID Device Info
74 volatile int n;
75
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);
78
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();
82
83 /* insert a delay between clk init and usb init */
84 for (n = 0; n < 75; n++) {__asm("nop");}
85
86 (*rom)->pUSBD->init(&DeviceInfo); /* USB Initialization */
87 (*rom)->pUSBD->connect(true); /* USB Connect */
88 usbMSCenabled|=USB_MSC_ENABLEFLAG;
89 }
90
91 #if CFG_USBMSC
92 void USB_IRQHandler() {
93 (*rom)->pUSBD->isr();
94 }
95 #endif
96
97 void usbMSCOff(void) {
98 (*rom)->pUSBD->connect(false); /* USB Disconnect */
99 usbMSCenabled&=~USB_MSC_ENABLEFLAG;
100 }
This page took 0.047771 seconds and 5 git commands to generate.