Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********************************************************************/
- /* Interfejsy w Systemach Komputerowych - Laboratorium nr 2 */
- /* Oprogramowanie wbudowane urzadzenia USB 3.1 Gen 1 */
- /********************************************************************/
- /* Wypelniaja studenci:
- Data zajec: 27.02.2017
- Numer sekcji: 11
- Numer stanowiska: 1
- Sklad podsekcji: Grzegorz Marczyk
- */
- //Fragmenty oznaczone STUDENT wymagaja uzupelnienia
- //odkomentowac do drugiego zadania
- #define SCPI
- #include "cyu3system.h"
- #include "cyu3os.h"
- #include "cyu3dma.h"
- #include "cyu3error.h"
- #include "firmware.h"
- #include "cyu3usb.h"
- #include "cyu3uart.h"
- #include "string.h"
- char znak = 'A'; // kod ascii duzej A
- //watek
- CyU3PThread thread;
- //kanaly DMA
- CyU3PDmaChannel channelForUSB; //kanal DMA pomiedzy procesorem a modulem USB
- CyU3PDmaChannel channelForUART; //kanal DMA pomiedzy modulem UART a modulem UART
- //funkcja wywolywana po odebraniu danych na porcie UART, po wyprodukowaniu danych
- void UART_receivedMessage(CyU3PDmaChannel *chHandle, CyU3PDmaCbType_t type, CyU3PDmaCBInput_t *input)
- {
- if (type == CY_U3P_DMA_CB_PROD_EVENT)
- {
- //bufor z odebranymi danymi
- uint8_t *buffer = input->buffer_p.buffer;
- //STUDENT - Zadanie 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- }
- }
- //ustawienie UART'a
- void UART_init()
- {
- //uruchomienie modulu UART'a
- CyU3PUartInit();
- //przygotowanie konfiguracji UART'a
- CyU3PUartConfig_t uartConfig;
- CyU3PMemSet((uint8_t *)&uartConfig, 0, sizeof (uartConfig));
- uartConfig.baudRate = 9600;
- uartConfig.stopBit = 1;
- uartConfig.parity = CY_U3P_UART_NO_PARITY;
- uartConfig.txEnable = CyTrue;
- uartConfig.rxEnable = CyTrue;
- uartConfig.flowCtrl = CyFalse;
- uartConfig.isDma = CyTrue;
- //ustawienie konfiguracji UART'a
- CyU3PUartSetConfig(&uartConfig, NULL);
- #ifdef SCPI
- //przygotowanie konfiguracji kanalu DMA miedzy wejsciem i wyjscie UART'a
- CyU3PDmaChannelConfig_t dmaConfig;
- CyU3PMemSet((uint8_t *)&dmaConfig, 0, sizeof(dmaConfig));
- dmaConfig.size = 16; //musi byc podzielny przez 16
- dmaConfig.count = 2;
- dmaConfig.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD;
- dmaConfig.consSckId = CY_U3P_LPP_SOCKET_UART_CONS;
- dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE;
- dmaConfig.notification = CY_U3P_DMA_CB_PROD_EVENT;
- dmaConfig.cb = UART_receivedMessage;
- dmaConfig.prodHeader = 0;
- dmaConfig.prodFooter = 0;
- dmaConfig.consHeader = 0;
- dmaConfig.prodAvailCount = 0;
- //utworzenie kanalu DMA dla UART'a
- CyU3PDmaChannelCreate(&channelForUART, CY_U3P_DMA_TYPE_MANUAL, &dmaConfig);
- //ustawienie nieskoczonej transmisji w kanale DMA
- CyU3PDmaChannelSetXfer(&channelForUART, 0);
- #endif
- //ustawienie nieskonczonej transmisji na TX i RX
- CyU3PUartTxSetBlockXfer(0xFFFFFFFF);
- CyU3PUartRxSetBlockXfer(0xFFFFFFFF);
- #ifndef SCPI
- CyU3PDebugInit(CY_U3P_LPP_SOCKET_UART_CONS, 255);
- CyU3PDebugPrint(0, "Hello USB 3.1. Gotowy do debugowania!\r\n");
- #endif
- }
- //funkcja wywolywana po oproznieniu bufora, wyslaniu danych na porcie USB
- void USB_bufferEmpty(CyU3PDmaChannel *channel, CyU3PDmaCbType_t type, CyU3PDmaCBInput_t *input)
- {
- CyU3PDmaBuffer_t buffer = input->buffer_p;
- if (type == CY_U3P_DMA_CB_CONS_EVENT)
- {
- int i;
- CyU3PDmaChannelGetBuffer(channel, &buffer, 0);
- for(i = 0; i < 1024; ++i){
- buffer.buffer[i] = znak;
- }
- CyU3PDmaChannelCommitBuffer(channel, 1024, 0);
- if(znak++ == 'Z'){
- znak ='A';
- }
- //STUDENT - Zadanie 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- }
- }
- void USB_init()
- {
- //uruchomienie modulu USB
- CyU3PUsbStart();
- //konfiguracja izochronicznego punktu koncowego
- CyU3PEpConfig_t epConfig;
- //STUDENT - Zadanie 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- //po ustawieniu setdown end point config, dokumentacja pol struktury platforma
- CyU3PMemSet((uint8_t)&epConfig, 0, sizeof(epConfig));
- epConfig.pcktSize = 1024;
- epConfig.burstLen = 1;
- epConfig.streams = 0;
- epConfig.enable = CyTrue;
- epConfig.epType = CY_U3P_USB_EP_ISO;
- epConfig.isoPkts = 1;
- CyU3PSetEpConfig(CY_FX_EP_CONSUMER, &epConfig);
- //oproznienie punktu koncowego
- CyU3PUsbFlushEp(CY_FX_EP_CONSUMER);
- //konfiguracja kanalu DMA
- CyU3PDmaChannelConfig_t dmaConfig;
- CyU3PMemSet((uint8_t *)&dmaConfig, 0, sizeof(dmaConfig));
- dmaConfig.size = 1024; //wielokrotnosc 16
- dmaConfig.count = 2;
- dmaConfig.prodSckId = CY_U3P_CPU_SOCKET_PROD;
- dmaConfig.consSckId = CY_FX_EP_CONSUMER_SOCKET;
- dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE;
- dmaConfig.notification = CY_U3P_DMA_CB_CONS_EVENT;
- dmaConfig.cb = USB_bufferEmpty;
- //utworzenie kanalu DMA dla USB
- CyU3PDmaChannelCreate(&channelForUSB, CY_U3P_DMA_TYPE_MANUAL_OUT, &dmaConfig);
- //ustawienie nieskonczonej transmisji w kanale DMA dla USB
- CyU3PDmaChannelSetXfer(&channelForUSB, 0);
- //wstepne wypelnienie buforow w kanale DMA dla USB
- //STUDENT - Zadanie 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- // get,memset,commitbuffer
- // smieci w buforach 2x petle zeby wykosic
- CyU3PDmaBuffer_t buffer;
- CyU3PReturnStatus_t buffStatus = CyU3PDmaChannelGetBuffer(&channelForUSB, &buffer, 0);
- int i;
- //CyU3PDebugPrint(0, "status: %d", buffStatus);
- for(i = 0; i < 1024; ++i) {
- buffer.buffer[i] = 'G';
- }
- CyU3PDmaChannelCommitBuffer(&channelForUSB, 1024, 0);
- buffStatus = CyU3PDmaChannelGetBuffer(&channelForUSB, &buffer, 0);
- //CyU3PDebugPrint(0, "status: %d", buffStatus);
- for(i = 0; i < 1024; ++i) {
- buffer.buffer[i] = 'M';
- }
- CyU3PDmaChannelCommitBuffer(&channelForUSB, 1024, 0);
- //zaladowanie deskryptorow
- CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_DEVICE_DESCR, NULL, (uint8_t *)CyFxUSB30DeviceDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_DEVICE_DESCR, NULL, (uint8_t *)CyFxUSB20DeviceDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, NULL, (uint8_t *)CyFxUSBBOSDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBSSConfigDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBHSConfigDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_FS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBFSConfigDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 0, (uint8_t *)CyFxUSBStringLangIDDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 1, (uint8_t *)CyFxUSBManufactureDscr);
- CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 2, (uint8_t *)CyFxUSBProductDscr);
- //aktywacja pinow portu USB
- CyU3PConnectState(CyTrue, CyTrue);
- //zablokowanie przejscia do stanow U1 i U2
- CyU3PUsbLPMDisable();
- }
- //funkcja wejsciowa watku
- void startThread(uint32_t input)
- {
- //inicjalizacja UARTa
- UART_init();
- //inicjalizacja USB
- USB_init();
- //oczekiwanie na zdarzenie (asynchroniczne)
- while(1);
- }
- //funkcja wywolywana po zaladowaniu systemu ThreadX
- void CyFxApplicationDefine()
- {
- //utworzenie watku aplikacji w systemie ThreadX
- CyU3PThreadCreate(&thread, //struktura dla watku
- "ISO", //nazwa watku
- startThread, //implementacja watku
- 0, //brak prarametrow
- CyU3PMemAlloc(4096), //stos o rozmiarze 4kB
- 4096, //rozmiar stosu
- 7, //priorytet watku
- 7, //priorytet wywlaszczenia
- 0, //brak ograniczenia na czas realizacji
- 1 //automatyczny start
- );
- }
- //glowna funkcja
- int main()
- {
- //inicjalizacja urzadzenia
- CyU3PDeviceInit(NULL);
- //inicjalizacja pamieci podrecznych
- CyU3PDeviceCacheControl(CyTrue, CyTrue, CyTrue);
- //konfiguracja portow
- CyU3PIoMatrixConfig_t io_cfg;
- io_cfg.isDQ32Bit = CyFalse;
- io_cfg.s0Mode = CY_U3P_SPORT_INACTIVE;
- io_cfg.s1Mode = CY_U3P_SPORT_INACTIVE;
- io_cfg.useUart = CyTrue;
- io_cfg.useI2C = CyFalse;
- io_cfg.useI2S = CyFalse;
- io_cfg.useSpi = CyFalse;
- io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_UART_ONLY;
- io_cfg.gpioSimpleEn[0] = 0;
- io_cfg.gpioSimpleEn[1] = 0;
- io_cfg.gpioComplexEn[0] = 0;
- io_cfg.gpioComplexEn[1] = 0;
- CyU3PDeviceConfigureIOMatrix (&io_cfg);
- //zaladowanie jadra systemu ThreadX
- CyU3PKernelEntry();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement