// Setup inline void Port_setup() { // Register Scan CLI dictionary CLI_registerDictionary( portCLIDict, portCLIDictName ); #if Port_SwapMode_define == USBSwap // USB Swap // Start, disabled GPIO_Ctrl( usb_swap_pin1, GPIO_Type_DriveSetup, GPIO_Config_None ); GPIO_Ctrl( usb_swap_pin1, GPIO_Type_DriveLow, GPIO_Config_None ); #elif Port_SwapMode_define == USBInterSwap // USB Swap // Start, disabled GPIO_Ctrl( usb_swap_pin1, GPIO_Type_DriveSetup, GPIO_Config_None ); GPIO_Ctrl( usb_swap_pin1, GPIO_Type_DriveLow, GPIO_Config_None ); // UART Tx/Rx cross-over // Start, disabled GPIO_Ctrl( uart_cross_pin1, GPIO_Type_DriveSetup, GPIO_Config_None ); GPIO_Ctrl( uart_cross_pin1, GPIO_Type_DriveLow, GPIO_Config_None ); // UART Swap // Start, disabled GPIO_Ctrl( uart_swap_pin1, GPIO_Type_DriveSetup, GPIO_Config_None ); GPIO_Ctrl( uart_swap_pin1, GPIO_Type_DriveLow, GPIO_Config_None ); #else warn_print("Unsupported"); #endif // Starting point for automatic port swapping Port_lastcheck_ms = systick_millis_count; // Allocate latency measurement resource portLatencyResource = Latency_add_resource("PortSwap", LatencyOption_Ticks); }
inline void Macro_setup() { // Register Macro CLI dictionary CLI_registerDictionary( macroCLIDict, macroCLIDictName ); // Disable Macro debug mode macroDebugMode = 0; // Disable Macro pause flag macroPauseMode = 0; // Set Macro step counter to zero macroStepCounter = 0; // Disable Macro Vote debug mode voteDebugMode = 0; // Disable Trigger Pending debug mode triggerPendingDebugMode = 0; // Make sure macro trigger event buffer is empty macroTriggerEventBufferSize = 0; // Setup Layers Layer_setup(); // Setup Triggers Trigger_setup(); // Setup Results Result_setup(); // Allocate resource for latency measurement macroLatencyResource = Latency_add_resource("PartialMap", LatencyOption_Ticks); }
// USB Module Setup inline void Output_setup() { // Register USB Output CLI dictionary CLI_registerDictionary( outputCLIDict, outputCLIDictName ); // Flush key buffers Output_flushBuffers(); #if enableRawIO_define == 1 // Setup HID-IO HIDIO_setup(); #endif // Latency resource allocation outputPeriodicLatencyResource = Latency_add_resource("USBOutputPeri", LatencyOption_Ticks); outputPollLatencyResource = Latency_add_resource("USBOutputPoll", LatencyOption_Ticks); }
// Setup inline void LED_setup() { // Register Scan CLI dictionary CLI_registerDictionary( ledCLIDict, ledCLIDictName ); #if Storage_Enable_define == 1 Storage_registerModule(&LedStorage); #endif // Zero out FPS time LED_timePrev = Time_now(); // Initialize framerate LED_framerate = ISSI_FrameRate_ms_define; // Global brightness setting LED_brightness = ISSI_Global_Brightness_define; // Initialize I2C error counters i2c_initial(); // Initialize I2C i2c_setup(); // Setup LED_pageBuffer addresses and brightness section LED_pageBuffer[0].i2c_addr = LED_MapCh1_Addr_define; LED_pageBuffer[0].reg_addr = ISSI_LEDPwmRegStart; #if ISSI_Chips_define >= 2 LED_pageBuffer[1].i2c_addr = LED_MapCh2_Addr_define; LED_pageBuffer[1].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 3 LED_pageBuffer[2].i2c_addr = LED_MapCh3_Addr_define; LED_pageBuffer[2].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 4 LED_pageBuffer[3].i2c_addr = LED_MapCh4_Addr_define; LED_pageBuffer[3].reg_addr = ISSI_LEDPwmRegStart; #endif // Brightness emulation #if ISSI_Chip_31FL3731_define // Setup LED_pageBuffer addresses and brightness section LED_pageBuffer_brightness[0].i2c_addr = LED_MapCh1_Addr_define; LED_pageBuffer_brightness[0].reg_addr = ISSI_LEDPwmRegStart; #if ISSI_Chips_define >= 2 LED_pageBuffer_brightness[1].i2c_addr = LED_MapCh2_Addr_define; LED_pageBuffer_brightness[1].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 3 LED_pageBuffer_brightness[2].i2c_addr = LED_MapCh3_Addr_define; LED_pageBuffer_brightness[2].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 4 LED_pageBuffer_brightness[3].i2c_addr = LED_MapCh4_Addr_define; LED_pageBuffer_brightness[3].reg_addr = ISSI_LEDPwmRegStart; #endif #endif // LED default setting LED_enable = ISSI_Enable_define; LED_enable_current = ISSI_Enable_define; // Needs a default setting, almost always unset immediately // Enable Hardware shutdown (pull low) GPIO_Ctrl( hardware_shutdown_pin, GPIO_Type_DriveSetup, GPIO_Config_Pullup ); GPIO_Ctrl( hardware_shutdown_pin, GPIO_Type_DriveLow, GPIO_Config_Pullup ); #if ISSI_Chip_31FL3733_define == 1 || ISSI_Chip_31FL3736_define == 1 // Reset I2C bus (pull high, then low) // NOTE: This GPIO may be shared with the debug LED GPIO_Ctrl( iirst_pin, GPIO_Type_DriveSetup, GPIO_Config_Pullup ); GPIO_Ctrl( iirst_pin, GPIO_Type_DriveHigh, GPIO_Config_Pullup ); delay_us(50); GPIO_Ctrl( iirst_pin, GPIO_Type_DriveLow, GPIO_Config_Pullup ); #endif // Zero out Frame Registers // This needs to be done before disabling the hardware shutdown (or the leds will do undefined things) LED_zeroControlPages(); // Disable Hardware shutdown of ISSI chips (pull high) if ( LED_enable && LED_enable_current ) { GPIO_Ctrl( hardware_shutdown_pin, GPIO_Type_DriveHigh, GPIO_Config_Pullup ); } // Reset LED sequencing LED_reset(); // Allocate latency resource ledLatencyResource = Latency_add_resource("ISSILed", LatencyOption_Ticks); }
// Setup connection to other side // - Only supports a single slave and master // - If USB has been initiallized at this point, this side is the master // - If both sides assert master, flash error leds void Connect_setup( uint8_t master, uint8_t first ) { // Indication that UARTs are not ready uarts_configured = 0; // Register Connect CLI dictionary if ( first ) { CLI_registerDictionary( uartConnectCLIDict, uartConnectCLIDictName ); } // Check if master Connect_master = master; if ( Connect_master ) { Connect_id = MASTER_ID; // 0x00 is always the master Id } #if defined(_kinetis_) // UART0 setup // UART1 setup // Setup the the UART interface for keyboard data input SIM_SCGC4 |= SIM_SCGC4_UART0; // Disable clock gating SIM_SCGC4 |= SIM_SCGC4_UART1; // Disable clock gating // Pin Setup for UART0 / UART1 PORTA_PCR1 = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(2); // RX Pin PORTA_PCR2 = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(2); // TX Pin PORTE_PCR0 = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); // RX Pin PORTE_PCR1 = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); // TX Pin // Baud Rate setting UART0_BDH = (uint8_t)(Connect_baud >> 8); UART0_BDL = (uint8_t)Connect_baud; UART0_C4 = Connect_baudFine; UART1_BDH = (uint8_t)(Connect_baud >> 8); UART1_BDL = (uint8_t)Connect_baud; UART1_C4 = Connect_baudFine; // 8 bit, Even Parity, Idle Character bit after stop // NOTE: For 8 bit with Parity you must enable 9 bit transmission (pg. 1065) // You only need to use UART0_D for 8 bit reading/writing though // UART_C1_M UART_C1_PE UART_C1_PT UART_C1_ILT UART0_C1 = UART_C1_M | UART_C1_PE | UART_C1_ILT; UART1_C1 = UART_C1_M | UART_C1_PE | UART_C1_ILT; // Only using Tx Fifos UART0_PFIFO = UART_PFIFO_TXFE; UART1_PFIFO = UART_PFIFO_TXFE; // Setup DMA clocks SIM_SCGC6 |= SIM_SCGC6_DMAMUX; SIM_SCGC7 |= SIM_SCGC7_DMA; // Start with channels disabled first DMAMUX0_CHCFG0 = 0; DMAMUX0_CHCFG1 = 0; // Configure DMA channels //DMA_DSR_BCR0 |= DMA_DSR_BCR_DONE_MASK; // TODO What's this? DMA_TCD0_CSR = 0; DMA_TCD1_CSR = 0; // Default control register DMA_CR = 0; // DMA Priority DMA_DCHPRI0 = 0; // Ch 0, priority 0 DMA_DCHPRI1 = 1; // ch 1, priority 1 // Clear error interrupts DMA_EEI = 0; // Setup TCD DMA_TCD0_SADDR = (uint32_t*)&UART0_D; DMA_TCD1_SADDR = (uint32_t*)&UART1_D; DMA_TCD0_SOFF = 0; DMA_TCD1_SOFF = 0; // No modulo, 8-bit transfer size DMA_TCD0_ATTR = DMA_TCD_ATTR_SMOD(0) | DMA_TCD_ATTR_SSIZE(0) | DMA_TCD_ATTR_DMOD(0) | DMA_TCD_ATTR_DSIZE(0); DMA_TCD1_ATTR = DMA_TCD_ATTR_SMOD(0) | DMA_TCD_ATTR_SSIZE(0) | DMA_TCD_ATTR_DMOD(0) | DMA_TCD_ATTR_DSIZE(0); // One byte transferred at a time DMA_TCD0_NBYTES_MLNO = 1; DMA_TCD1_NBYTES_MLNO = 1; // Source address does not change DMA_TCD0_SLAST = 0; DMA_TCD1_SLAST = 0; // Destination buffer DMA_TCD0_DADDR = (uint32_t*)uart_rx_buf[0].buffer; DMA_TCD1_DADDR = (uint32_t*)uart_rx_buf[1].buffer; // Incoming byte, increment by 1 in the rx buffer DMA_TCD0_DOFF = 1; DMA_TCD1_DOFF = 1; // Single major loop, must be the same value DMA_TCD0_CITER_ELINKNO = UART_Buffer_Size; DMA_TCD1_CITER_ELINKNO = UART_Buffer_Size; DMA_TCD0_BITER_ELINKNO = UART_Buffer_Size; DMA_TCD1_BITER_ELINKNO = UART_Buffer_Size; // Reset buffer when full DMA_TCD0_DLASTSGA = -( UART_Buffer_Size ); DMA_TCD1_DLASTSGA = -( UART_Buffer_Size ); // Enable DMA channels DMA_ERQ |= DMA_ERQ_ERQ0 | DMA_ERQ_ERQ1; // Setup DMA channel routing DMAMUX0_CHCFG0 = DMAMUX_ENABLE | DMAMUX_SOURCE_UART0_RX; DMAMUX0_CHCFG1 = DMAMUX_ENABLE | DMAMUX_SOURCE_UART1_RX; // Enable DMA requests (requires Rx interrupts) UART0_C5 = UART_C5_RDMAS; UART1_C5 = UART_C5_RDMAS; // TX Enabled, RX Enabled, RX Interrupt Enabled UART0_C2 = UART_C2_TE | UART_C2_RE | UART_C2_RIE; UART1_C2 = UART_C2_TE | UART_C2_RE | UART_C2_RIE; // Add interrupts to the vector table NVIC_ENABLE_IRQ( IRQ_UART0_STATUS ); NVIC_ENABLE_IRQ( IRQ_UART1_STATUS ); #elif defined(_sam_) //SAM TODO #endif Connect_LastCurrentValue = 50; // Default to 50 mA // UARTs are now ready to go uarts_configured = 1; // Reset the state of the UART variables Connect_reset(); // Allocate latency measurement resource connectLatencyResource = Latency_add_resource("UARTConnect", LatencyOption_Ticks); }
// Setup GPIO pins for matrix scanning void Matrix_setup() { // Register Matrix CLI dictionary CLI_registerDictionary( matrixCLIDict, matrixCLIDictName ); #if defined(_sam_) // 31.5.8 Reading the I/O line levels requires the clock of the PIO Controller to be enabled PMC->PMC_PCER0 = (1 << ID_PIOA) | (1 << ID_PIOB); #endif // Setup Strobe Pins for ( uint8_t pin = 0; pin < Matrix_colsNum; pin++ ) { GPIO_Ctrl( Matrix_cols[ pin ], GPIO_Type_DriveSetup, Matrix_type ); } // Setup Sense Pins for ( uint8_t pin = 0; pin < Matrix_rowsNum; pin++ ) { GPIO_Ctrl( Matrix_rows[ pin ], GPIO_Type_ReadSetup, Matrix_type ); } // Clear out Debounce Array for ( uint8_t item = 0; item < Matrix_maxKeys; item++ ) { Matrix_scanArray[ item ].prevState = KeyState_Off; Matrix_scanArray[ item ].curState = KeyState_Off; Matrix_scanArray[ item ].activeCount = 0; Matrix_scanArray[ item ].inactiveCount = DebounceDivThreshold; // Start at 'off' steady state Matrix_scanArray[ item ].prevDecisionTime = 0; } // Reset strobe position matrixCurrentStrobe = 0; // Debug mode matrixDebugMode = 0; // Debug counter reset matrixDebugStateCounter = 0; // Debounce expiry time debounceExpiryTime = MinDebounceTime_define; // Strobe delay setting strobeDelayTime = StrobeDelay_define; // Setup tick duration (multiples of 1 second) activity_tick_duration = Time_init(); activity_tick_duration.ms = 1000 * ActivityTimerMultiplier_define; // Setup Activity and Inactivity tick resources Time_tick_start( &activity_tickstore, activity_tick_duration, TickStore_MaxTicks ); Time_tick_start( &inactivity_tickstore, activity_tick_duration, TickStore_MaxTicks ); // Clear matrixStateActiveCount for activity check matrixStateActiveCount = 0; matrixStatePressCount = 0; matrixStateReleaseCount = 0; // Setup latency module matrixLatencyResource = Latency_add_resource("MatrixARMPeri", LatencyOption_Ticks); }
// Setup inline void LED_setup() { // Register Scan CLI dictionary CLI_registerDictionary( ledCLIDict, ledCLIDictName ); // Zero out FPS time LED_timePrev = Time_now(); // Initialize framerate LED_framerate = ISSI_FrameRate_ms_define; // Global brightness setting LED_brightness = ISSI_Global_Brightness_define; // Initialize I2C i2c_setup(); // Setup LED_pageBuffer addresses and brightness section LED_pageBuffer[0].i2c_addr = LED_MapCh1_Addr_define; LED_pageBuffer[0].reg_addr = ISSI_LEDPwmRegStart; #if ISSI_Chips_define >= 2 LED_pageBuffer[1].i2c_addr = LED_MapCh2_Addr_define; LED_pageBuffer[1].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 3 LED_pageBuffer[2].i2c_addr = LED_MapCh3_Addr_define; LED_pageBuffer[2].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 4 LED_pageBuffer[3].i2c_addr = LED_MapCh4_Addr_define; LED_pageBuffer[3].reg_addr = ISSI_LEDPwmRegStart; #endif // Brightness emulation #if ISSI_Chip_31FL3731_define // Setup LED_pageBuffer addresses and brightness section LED_pageBuffer_brightness[0].i2c_addr = LED_MapCh1_Addr_define; LED_pageBuffer_brightness[0].reg_addr = ISSI_LEDPwmRegStart; #if ISSI_Chips_define >= 2 LED_pageBuffer_brightness[1].i2c_addr = LED_MapCh2_Addr_define; LED_pageBuffer_brightness[1].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 3 LED_pageBuffer_brightness[2].i2c_addr = LED_MapCh3_Addr_define; LED_pageBuffer_brightness[2].reg_addr = ISSI_LEDPwmRegStart; #endif #if ISSI_Chips_define >= 4 LED_pageBuffer_brightness[3].i2c_addr = LED_MapCh4_Addr_define; LED_pageBuffer_brightness[3].reg_addr = ISSI_LEDPwmRegStart; #endif #endif // LED default setting LED_enable = ISSI_Enable_define; // Enable Hardware shutdown (pull low) GPIOB_PDDR |= (1<<16); PORTB_PCR16 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); GPIOB_PCOR |= (1<<16); #if ISSI_Chip_31FL3733_define == 1 // Reset I2C bus (pull high, then low) // NOTE: This GPIO may be shared with the debug LED GPIOA_PDDR |= (1<<5); PORTA_PCR5 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1); GPIOC_PSOR |= (1<<5); delay_us(50); GPIOC_PCOR |= (1<<5); #endif // Zero out Frame Registers // This needs to be done before disabling the hardware shutdown (or the leds will do undefined things) LED_zeroControlPages(); // Disable Hardware shutdown of ISSI chips (pull high) if ( LED_enable ) { GPIOB_PSOR |= (1<<16); } // Reset LED sequencing LED_reset(); // Allocate latency resource ledLatencyResource = Latency_add_resource("ISSILed", LatencyOption_Ticks); }