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 }; }
void serial_init(void) { gpio_peripheral('A', PIO_PA8A_URXD, 'A', 1); gpio_peripheral('A', PIO_PA9A_UTXD, 'A', 0); // Reset uart PMC->PMC_PCER0 = 1 << ID_UART; UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; UART->UART_IDR = 0xFFFFFFFF; // Enable uart UART->UART_MR = (US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO | UART_MR_CHMODE_NORMAL); UART->UART_BRGR = SystemCoreClock / (16 * CONFIG_SERIAL_BAUD); UART->UART_IER = UART_IER_RXRDY; NVIC_EnableIRQ(UART_IRQn); NVIC_SetPriority(UART_IRQn, 0); UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; }