#include #include #include "include.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_uart.h" #include "driverlib/gpio.h" #include "Drivers/USB_Communication/USBCDCD.h" #include #include "Stub_Status.h" void Stub_GPIOWriteBitRequest(MessageContainer* requestContainer) { uint32_t status = FAILED; MessageContainer responseContainer; StubGPIOWriteBitRequest* request = stub_gpiowrite_bit_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); uint8_t PinId = 0; uint32_t PortId = 0; switch(request->pinid) { case 0: PinId = GPIO_PIN_0; break; case 1: PinId = GPIO_PIN_1; break; case 2: PinId = GPIO_PIN_2; break; case 3: PinId = GPIO_PIN_3; break; case 4: PinId = GPIO_PIN_4; break; case 5: PinId = GPIO_PIN_5; break; case 6: PinId = GPIO_PIN_6; break; case 7: PinId = GPIO_PIN_7; break; default: break; } char Port = request->portid[0]; switch(Port) { #ifdef USE_HIGH_SPEED_GPIO case 'A': PortId = GPIO_PORTA_AHB_BASE; break; case 'B': PortId = GPIO_PORTB_AHB_BASE; break; case 'C': PortId = GPIO_PORTC_AHB_BASE; break; case 'D': PortId = GPIO_PORTD_AHB_BASE; break; case 'E': PortId = GPIO_PORTE_AHB_BASE; break; case 'F': PortId = GPIO_PORTF_AHB_BASE; break; case 'G': PortId = GPIO_PORTG_AHB_BASE; break; case 'H': PortId = GPIO_PORTH_AHB_BASE; break; case 'J': PortId = GPIO_PORTJ_AHB_BASE; break; #else case 'A': PortId = GPIO_PORTA_BASE; break; case 'B': PortId = GPIO_PORTB_BASE; break; case 'C': PortId = GPIO_PORTC_BASE; break; case 'D': PortId = GPIO_PORTD_BASE; break; case 'E': PortId = GPIO_PORTE_BASE; break; case 'F': PortId = GPIO_PORTF_BASE; break; case 'G': PortId = GPIO_PORTG_BASE; break; case 'H': PortId = GPIO_PORTH_BASE; break; case 'J': PortId = GPIO_PORTJ_BASE; break; #endif case 'K': PortId = GPIO_PORTK_BASE; break; case 'L': PortId = GPIO_PORTL_BASE; break; case 'M': PortId = GPIO_PORTM_BASE; break; case 'N': PortId = GPIO_PORTN_BASE; break; case 'P': PortId = GPIO_PORTP_BASE; break; case 'Q': PortId = GPIO_PORTQ_BASE; break; case 'R': PortId = GPIO_PORTR_BASE; break; case 'S': PortId = GPIO_PORTS_BASE; break; case 'T': PortId = GPIO_PORTT_BASE; break; default: LOG_ERROR (request->portid," Unsupported Port ID "); break; } ROM_GPIOPinTypeGPIOOutput(PortId, PinId); // set the requested GPIO to output SysCtlDelay(10000); if(request->bittowrite) ROM_GPIOPinWrite(PortId, PinId, ROM_GPIOPinRead(PortId, GPIO_BYTE) | PinId); //Turn ON the requested GPIO else ROM_GPIOPinWrite(PortId, PinId, ROM_GPIOPinRead(PortId, GPIO_BYTE) & ~PinId); //Turn OFF the requested GPIO //GPIOPinWrite(PortId, PinId, PinId*request->bittowrite);// StubGPIOWriteBitResponse response = STUB_GPIOWRITE_BIT_RESPONSE__INIT; response.portid = request->portid; response.pinid = request->pinid; response.has_pinid = true; //Verify Writing if(request->bittowrite) { if(ROM_GPIOPinRead(PortId, PinId) == PinId) status = VERIFIED; } else { if(ROM_GPIOPinRead(PortId, PinId) == 0) status = VERIFIED; } status_response(status,&response.status, &response.statusword ,&response.has_statusword); responseContainer = createContainer(MESSAGE_TYPE__StubGPIOWriteBitResponse, requestContainer->token, true, &response, &stub_gpiowrite_bit_response__pack, &stub_gpiowrite_bit_response__get_packed_size); //------------------------------------------------------------------------------------------- uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer)); size_t container_size = message_container__pack(&responseContainer, container_buffer); free(responseContainer.data.data); SendChars((char*)container_buffer, container_size); //free(container_buffer); stub_gpiowrite_bit_request__free_unpacked(request, NULL); //free(requestContainer); } // void Stub_GPIOReadByteRequest(MessageContainer* requestContainer) { uint32_t status = PASSED; MessageContainer responseContainer; StubGPIOReadByteRequest* request = stub_gpioread_byte_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); char Port = request->portid[0]; uint32_t PortId = 0; switch(Port) { #ifdef USE_HIGH_SPEED_GPIO case 'A': PortId = GPIO_PORTA_AHB_BASE; break; case 'B': PortId = GPIO_PORTB_AHB_BASE; break; case 'C': PortId = GPIO_PORTC_AHB_BASE; break; case 'D': PortId = GPIO_PORTD_AHB_BASE; break; case 'E': PortId = GPIO_PORTE_AHB_BASE; break; case 'F': PortId = GPIO_PORTF_AHB_BASE; break; case 'G': PortId = GPIO_PORTG_AHB_BASE; break; case 'H': PortId = GPIO_PORTH_AHB_BASE; break; case 'J': PortId = GPIO_PORTJ_AHB_BASE; break; #else case 'A': PortId = GPIO_PORTA_BASE; break; case 'B': PortId = GPIO_PORTB_BASE; break; case 'C': PortId = GPIO_PORTC_BASE; break; case 'D': PortId = GPIO_PORTD_BASE; break; case 'E': PortId = GPIO_PORTE_BASE; break; case 'F': PortId = GPIO_PORTF_BASE; break; case 'G': PortId = GPIO_PORTG_BASE; break; case 'H': PortId = GPIO_PORTH_BASE; break; case 'J': PortId = GPIO_PORTJ_BASE; break; #endif case 'K': PortId = GPIO_PORTK_BASE; break; case 'L': PortId = GPIO_PORTL_BASE; break; case 'M': PortId = GPIO_PORTM_BASE; break; case 'N': PortId = GPIO_PORTN_BASE; break; case 'P': PortId = GPIO_PORTP_BASE; break; case 'Q': PortId = GPIO_PORTQ_BASE; break; case 'R': PortId = GPIO_PORTR_BASE; break; case 'S': PortId = GPIO_PORTS_BASE; break; case 'T': PortId = GPIO_PORTT_BASE; break; default: LOG_ERROR (request->portid," Unsupported Port ID "); break; } StubGPIOReadByteResponse response = STUB_GPIOREAD_BYTE_RESPONSE__INIT; response.portid = request->portid; char temp = ROM_GPIOPinRead(PortId, GPIO_BYTE); response.bytevalue = temp; response.has_bytevalue = true; status_response(status,&response.status, &response.statusword ,&response.has_statusword); responseContainer = createContainer(MESSAGE_TYPE__StubGPIOReadByteResponse, requestContainer->token, true, &response, &stub_gpioread_byte_response__pack, &stub_gpioread_byte_response__get_packed_size); //------------------------------------------------------------------------------------------- uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer)); size_t container_size = message_container__pack(&responseContainer, container_buffer); free(responseContainer.data.data); SendChars((char*)container_buffer, container_size); //free(container_buffer); //free(requestContainer); stub_gpioread_byte_request__free_unpacked(request,NULL); } void Stub_GPIOReadBitRequest(MessageContainer* requestContainer) { uint32_t status = PASSED; MessageContainer responseContainer; StubGPIOReadBitRequest* request = stub_gpioread_bit_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); uint8_t PinId = 0; uint32_t PortId = 0; switch(request->pinid) { case 0: PinId = GPIO_PIN_0; break; case 1: PinId = GPIO_PIN_1; break; case 2: PinId = GPIO_PIN_2; break; case 3: PinId = GPIO_PIN_3; break; case 4: PinId = GPIO_PIN_4; break; case 5: PinId = GPIO_PIN_5; break; case 6: PinId = GPIO_PIN_6; break; case 7: PinId = GPIO_PIN_7; break; default: break; } char Port = request->portid[0]; switch(Port) { #ifdef USE_HIGH_SPEED_GPIO case 'A': PortId = GPIO_PORTA_AHB_BASE; break; case 'B': PortId = GPIO_PORTB_AHB_BASE; break; case 'C': PortId = GPIO_PORTC_AHB_BASE; break; case 'D': PortId = GPIO_PORTD_AHB_BASE; break; case 'E': PortId = GPIO_PORTE_AHB_BASE; break; case 'F': PortId = GPIO_PORTF_AHB_BASE; break; case 'G': PortId = GPIO_PORTG_AHB_BASE; break; case 'H': PortId = GPIO_PORTH_AHB_BASE; break; case 'J': PortId = GPIO_PORTJ_AHB_BASE; break; #else case 'A': PortId = GPIO_PORTA_BASE; break; case 'B': PortId = GPIO_PORTB_BASE; break; case 'C': PortId = GPIO_PORTC_BASE; break; case 'D': PortId = GPIO_PORTD_BASE; break; case 'E': PortId = GPIO_PORTE_BASE; break; case 'F': PortId = GPIO_PORTF_BASE; break; case 'G': PortId = GPIO_PORTG_BASE; break; case 'H': PortId = GPIO_PORTH_BASE; break; case 'J': PortId = GPIO_PORTJ_BASE; break; #endif case 'K': PortId = GPIO_PORTK_BASE; break; case 'L': PortId = GPIO_PORTL_BASE; break; case 'M': PortId = GPIO_PORTM_BASE; break; case 'N': PortId = GPIO_PORTN_BASE; break; case 'P': PortId = GPIO_PORTP_BASE; break; case 'Q': PortId = GPIO_PORTQ_BASE; break; case 'R': PortId = GPIO_PORTR_BASE; break; case 'S': PortId = GPIO_PORTS_BASE; break; case 'T': PortId = GPIO_PORTT_BASE; break; default: LOG_ERROR (request->portid," Unsupported Port ID "); break; } ///////////////////////////////////////////----------------------------------------------------------------------------- char temp; uint8_t expvalue; uint32_t timeout = 10000; if(request->pollexpvalue) expvalue = PinId; //Polling if(request->polling) { do { timeout--; SysCtlDelay(10000); temp = ROM_GPIOPinRead(PortId, PinId); } while(( temp != expvalue) && (timeout)); } else { temp = ROM_GPIOPinRead(PortId, PinId); } StubGPIOReadBitResponse response = STUB_GPIOREAD_BIT_RESPONSE__INIT; response.portid = request->portid; response.pinid = request->pinid; response.has_pinid = true; response.bitvalue = temp; response.has_bitvalue = true; status_response(status,&response.status, &response.statusword ,&response.has_statusword); responseContainer = createContainer(MESSAGE_TYPE__StubGPIOReadBitResponse, requestContainer->token, true, &response, &stub_gpioread_bit_response__pack, &stub_gpioread_bit_response__get_packed_size); ///////////////////////////////////////////----------------------------------------------------------------------------- /* // if( (PortId == GPIO_PORTS_BASE) && (PinId == GPIO_PIN_3)) // { // MAP_GPIOPinTypeGPIOInput(GPIO_PORTS_BASE, GPIO_PIN_3); // Enable pin PS3 for GPIOInput // GPIOPadConfigSet(GPIO_PORTS_BASE,GPIO_PIN_3,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);//Configure GPIO pull up resistors. NOTE: does not work if ROM_GPIOPinTypeGPIOInput() isnt called before. // //GPIOPadConfigSet(GPIO_PORTS_BASE,GPIO_PIN_3,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPD );//Configure GPIO pull down resistors. NOTE: does not work if ROM_GPIOPinTypeGPIOInput() isnt called before. // } //ROM_GPIOPinTypeGPIOInput(PortId, PinId); // set the requested GPIO to Input //SysCtlDelay(10000); StubGPIOReadBitResponse response = STUB_GPIOREAD_BIT_RESPONSE__INIT; response.portid = request->portid; response.pinid = request->pinid; response.has_pinid = true; char temp = ROM_GPIOPinRead(PortId, PinId); //char temp2 = ROM_GPIOPinRead(GPIO_PORTQ_BASE, GPIO_BYTE); //GPIOPinTypeGPIOInput(GPIO_PORTS_BASE, GPIO_PIN_3); // set the requested GPIO to Input //SysCtlDelay(10000); //char temp3 = GPIOPinRead(GPIO_PORTS_BASE, GPIO_PIN_3); //char temp4 = GPIOPinRead(GPIO_PORTS_BASE, GPIO_BYTE); response.bitvalue = temp; response.has_bitvalue = true; response.status = OK; response.has_status = true; responseContainer = createContainer(MESSAGE_TYPE__StubGPIOReadBitResponse, requestContainer->token, true, &response, &stub_gpioread_bit_response__pack, &stub_gpioread_bit_response__get_packed_size); */ //------------------------------------------------------------------------------------------- uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer)); size_t container_size = message_container__pack(&responseContainer, container_buffer); free(responseContainer.data.data); SendChars((char*)container_buffer, container_size); //free(container_buffer); //free(requestContainer); stub_gpioread_bit_request__free_unpacked(request,NULL); } void Stub_GPIOWriteByteRequest(MessageContainer* requestContainer) { uint32_t status = FAILED; MessageContainer responseContainer; StubGPIOWriteByteRequest* request = stub_gpiowrite_byte_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); uint32_t PortId = 0; char Port = request->portid[0]; switch(Port) { #ifdef USE_HIGH_SPEED_GPIO case 'A': PortId = GPIO_PORTA_AHB_BASE; break; case 'B': PortId = GPIO_PORTB_AHB_BASE; break; case 'C': PortId = GPIO_PORTC_AHB_BASE; break; case 'D': PortId = GPIO_PORTD_AHB_BASE; break; case 'E': PortId = GPIO_PORTE_AHB_BASE; break; case 'F': PortId = GPIO_PORTF_AHB_BASE; break; case 'G': PortId = GPIO_PORTG_AHB_BASE; break; case 'H': PortId = GPIO_PORTH_AHB_BASE; break; case 'J': PortId = GPIO_PORTJ_AHB_BASE; break; #else case 'A': PortId = GPIO_PORTA_BASE; break; case 'B': PortId = GPIO_PORTB_BASE; break; case 'C': PortId = GPIO_PORTC_BASE; break; case 'D': PortId = GPIO_PORTD_BASE; break; case 'E': PortId = GPIO_PORTE_BASE; break; case 'F': PortId = GPIO_PORTF_BASE; break; case 'G': PortId = GPIO_PORTG_BASE; break; case 'H': PortId = GPIO_PORTH_BASE; break; case 'J': PortId = GPIO_PORTJ_BASE; break; #endif case 'K': PortId = GPIO_PORTK_BASE; break; case 'L': PortId = GPIO_PORTL_BASE; break; case 'M': PortId = GPIO_PORTM_BASE; break; case 'N': PortId = GPIO_PORTN_BASE; break; case 'P': PortId = GPIO_PORTP_BASE; break; case 'Q': PortId = GPIO_PORTQ_BASE; break; case 'R': PortId = GPIO_PORTR_BASE; break; case 'S': PortId = GPIO_PORTS_BASE; break; case 'T': PortId = GPIO_PORTS_BASE; break; default: LOG_ERROR (request->portid," Unsupported Port ID "); break; } ROM_GPIOPinTypeGPIOOutput(PortId, GPIO_BYTE); // set the requested GPIO to output SysCtlDelay(10000); ROM_GPIOPinWrite(PortId, GPIO_BYTE, request->datatowrite); //Turn ON the requested GPIOs BYTE StubGPIOWriteByteResponse response = STUB_GPIOWRITE_BYTE_RESPONSE__INIT; response.portid = request->portid; //Verify writing if(ROM_GPIOPinRead(PortId, GPIO_BYTE) == request->datatowrite) { status = VERIFIED; } status_response(status,&response.status, &response.statusword ,&response.has_statusword); responseContainer = createContainer(MESSAGE_TYPE__StubGPIOWriteByteResponse, requestContainer->token, true, &response, &stub_gpiowrite_byte_response__pack, &stub_gpiowrite_byte_response__get_packed_size); //------------------------------------------------------------------------------------------- uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer)); size_t container_size = message_container__pack(&responseContainer, container_buffer); free(responseContainer.data.data); SendChars((char*)container_buffer, container_size); //free(container_buffer); //free(requestContainer); stub_gpiowrite_byte_request__free_unpacked(request,NULL); } void Stub_GPIOInputSetupRequest(MessageContainer* requestContainer) { uint32_t status = PASSED; MessageContainer responseContainer; StubGPIOInputSetupRequest* request = stub_gpioinput_setup_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); uint8_t PinId = 0; uint32_t PortId = 0; switch(request->pinid) { case 0: PinId = GPIO_PIN_0; break; case 1: PinId = GPIO_PIN_1; break; case 2: PinId = GPIO_PIN_2; break; case 3: PinId = GPIO_PIN_3; break; case 4: PinId = GPIO_PIN_4; break; case 5: PinId = GPIO_PIN_5; break; case 6: PinId = GPIO_PIN_6; break; case 7: PinId = GPIO_PIN_7; break; default: break; } char Port = request->portid[0]; switch(Port) { #ifdef USE_HIGH_SPEED_GPIO case 'A': PortId = GPIO_PORTA_AHB_BASE; break; case 'B': PortId = GPIO_PORTB_AHB_BASE; break; case 'C': PortId = GPIO_PORTC_AHB_BASE; break; case 'D': PortId = GPIO_PORTD_AHB_BASE; break; case 'E': PortId = GPIO_PORTE_AHB_BASE; break; case 'F': PortId = GPIO_PORTF_AHB_BASE; break; case 'G': PortId = GPIO_PORTG_AHB_BASE; break; case 'H': PortId = GPIO_PORTH_AHB_BASE; break; case 'J': PortId = GPIO_PORTJ_AHB_BASE; break; #else case 'A': PortId = GPIO_PORTA_BASE; break; case 'B': PortId = GPIO_PORTB_BASE; break; case 'C': PortId = GPIO_PORTC_BASE; break; case 'D': PortId = GPIO_PORTD_BASE; break; case 'E': PortId = GPIO_PORTE_BASE; break; case 'F': PortId = GPIO_PORTF_BASE; break; case 'G': PortId = GPIO_PORTG_BASE; break; case 'H': PortId = GPIO_PORTH_BASE; break; case 'J': PortId = GPIO_PORTJ_BASE; break; #endif case 'K': PortId = GPIO_PORTK_BASE; break; case 'L': PortId = GPIO_PORTL_BASE; break; case 'M': PortId = GPIO_PORTM_BASE; break; case 'N': PortId = GPIO_PORTN_BASE; break; case 'P': PortId = GPIO_PORTP_BASE; break; case 'Q': PortId = GPIO_PORTQ_BASE; break; case 'R': PortId = GPIO_PORTR_BASE; break; case 'S': PortId = GPIO_PORTS_BASE; break; case 'T': PortId = GPIO_PORTT_BASE; break; default: LOG_ERROR (request->portid," Unsupported Port ID "); break; } if(request->setinput == INPUT) { MAP_GPIOPinTypeGPIOInput(PortId, PinId); // Enable pin for GPIOInput if(request->setpullup == PULLUP) { GPIOPadConfigSet(PortId,PinId,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);//Configure GPIO pull up resistors. NOTE: does not work if ROM_GPIOPinTypeGPIOInput() isnt called before. } else //set pulldown: { GPIOPadConfigSet(GPIO_PORTS_BASE,GPIO_PIN_3,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPD );//Configure GPIO pull down resistors. NOTE: does not work if ROM_GPIOPinTypeGPIOInput() isnt called before. } } else { ROM_GPIOPinTypeGPIOOutput(PortId, PinId); // set the requested GPIO to output } SysCtlDelay(10000); StubGPIOInputSetupResponse response = STUB_GPIOINPUT_SETUP_RESPONSE__INIT; response.portid = request->portid; response.pinid = request->pinid; response.has_pinid = true; status_response(status,&response.status, &response.statusword ,&response.has_statusword); responseContainer = createContainer(MESSAGE_TYPE__StubGPIOInputSetupResponse, requestContainer->token, true, &response, &stub_gpioinput_setup_response__pack, &stub_gpioinput_setup_response__get_packed_size); //------------------------------------------------------------------------------------------- uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer)); size_t container_size = message_container__pack(&responseContainer, container_buffer); free(responseContainer.data.data); SendChars((char*)container_buffer, container_size); //free(container_buffer); //free(requestContainer); stub_gpioinput_setup_request__free_unpacked(request,NULL); }