void usbserial_init(void) { // configure usb clock enable_pclock(USB_GCLK_ID, 0); // configure USBD+ and USBD- pins gpio_peripheral('A', 24, 'G', 0); gpio_peripheral('A', 25, 'G', 0); uint16_t trim = (readl((void*)USB_FUSES_TRIM_ADDR) & USB_FUSES_TRIM_Msk) >> USB_FUSES_TRIM_Pos; uint16_t transp = (readl((void*)USB_FUSES_TRANSP_ADDR) & USB_FUSES_TRANSP_Msk) >> USB_FUSES_TRANSP_Pos; uint16_t transn = (readl((void*)USB_FUSES_TRANSN_ADDR) & USB_FUSES_TRANSN_Msk) >> USB_FUSES_TRANSN_Pos; USB->DEVICE.PADCAL.reg = (USB_PADCAL_TRIM(trim) | USB_PADCAL_TRANSP(transp) | USB_PADCAL_TRANSN(transn)); // Enable USB in device mode USB->DEVICE.CTRLA.reg = USB_CTRLA_ENABLE; USB->DEVICE.DESCADD.reg = (uint32_t)usb_desc; EP0.EPCFG.reg = USB_DEVICE_EPCFG_EPTYPE0(1) | USB_DEVICE_EPCFG_EPTYPE1(1); EP_ACM.EPCFG.reg = USB_DEVICE_EPCFG_EPTYPE1(4); USB->DEVICE.CTRLB.reg = 0; // enable irqs USB->DEVICE.INTENSET.reg = USB_DEVICE_INTENSET_EORST; NVIC_SetPriority(USB_IRQn, 1); NVIC_EnableIRQ(USB_IRQn); }
struct gpio_adc gpio_adc_setup(uint8_t pin) { // Find pin in adc_pins table int chan; for (chan=0; ; chan++) { if (chan >= ARRAY_SIZE(adc_pins)) shutdown("Not a valid ADC pin"); if (adc_pins[chan] == pin) break; } if (!is_enabled_pclock(PCLK_ADC)) { // Power up ADC enable_pclock(PCLK_ADC); uint32_t prescal = DIV_ROUND_UP(CONFIG_CLOCK_FREQ*4, ADC_FREQ_MAX) - 1; LPC_ADC->ADCR = adc_status.adcr = (1<<21) | ((prescal & 0xff) << 8); LPC_ADC->ADINTEN = 0xff; adc_status.chan = ADC_DONE; NVIC_SetPriority(ADC_IRQn, 0); NVIC_EnableIRQ(ADC_IRQn); } gpio_peripheral(pin, adc_pin_funcs[chan], 0); return (struct gpio_adc){ .chan = chan }; }