Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.76 KB | None | 0 0
  1. /********************************************************************/
  2. /* Interfejsy w Systemach Komputerowych - Laboratorium nr 2 */
  3. /* Oprogramowanie wbudowane urzadzenia USB 3.1 Gen 1 */
  4. /********************************************************************/
  5.  
  6. /* Wypelniaja studenci:
  7. Data zajec: 27.02.2017
  8. Numer sekcji: 11
  9. Numer stanowiska: 1
  10. Sklad podsekcji: Grzegorz Marczyk
  11. */
  12.  
  13. //Fragmenty oznaczone STUDENT wymagaja uzupelnienia
  14.  
  15. //odkomentowac do drugiego zadania
  16. #define SCPI
  17.  
  18. #include "cyu3system.h"
  19. #include "cyu3os.h"
  20. #include "cyu3dma.h"
  21. #include "cyu3error.h"
  22. #include "firmware.h"
  23. #include "cyu3usb.h"
  24. #include "cyu3uart.h"
  25. #include "string.h"
  26.  
  27. char znak = 'A'; // kod ascii duzej A
  28.  
  29. //watek
  30. CyU3PThread thread;
  31.  
  32. //kanaly DMA
  33. CyU3PDmaChannel channelForUSB; //kanal DMA pomiedzy procesorem a modulem USB
  34. CyU3PDmaChannel channelForUART; //kanal DMA pomiedzy modulem UART a modulem UART
  35.  
  36.  
  37. //funkcja wywolywana po odebraniu danych na porcie UART, po wyprodukowaniu danych
  38. void UART_receivedMessage(CyU3PDmaChannel *chHandle, CyU3PDmaCbType_t type, CyU3PDmaCBInput_t *input)
  39. {
  40. if (type == CY_U3P_DMA_CB_PROD_EVENT)
  41. {
  42. //bufor z odebranymi danymi
  43. uint8_t *buffer = input->buffer_p.buffer;
  44.  
  45. //STUDENT - Zadanie 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  46.  
  47. }
  48. }
  49.  
  50. //ustawienie UART'a
  51. void UART_init()
  52. {
  53. //uruchomienie modulu UART'a
  54. CyU3PUartInit();
  55.  
  56. //przygotowanie konfiguracji UART'a
  57. CyU3PUartConfig_t uartConfig;
  58. CyU3PMemSet((uint8_t *)&uartConfig, 0, sizeof (uartConfig));
  59. uartConfig.baudRate = 9600;
  60. uartConfig.stopBit = 1;
  61. uartConfig.parity = CY_U3P_UART_NO_PARITY;
  62. uartConfig.txEnable = CyTrue;
  63. uartConfig.rxEnable = CyTrue;
  64. uartConfig.flowCtrl = CyFalse;
  65. uartConfig.isDma = CyTrue;
  66.  
  67. //ustawienie konfiguracji UART'a
  68. CyU3PUartSetConfig(&uartConfig, NULL);
  69.  
  70. #ifdef SCPI
  71. //przygotowanie konfiguracji kanalu DMA miedzy wejsciem i wyjscie UART'a
  72. CyU3PDmaChannelConfig_t dmaConfig;
  73. CyU3PMemSet((uint8_t *)&dmaConfig, 0, sizeof(dmaConfig));
  74. dmaConfig.size = 16; //musi byc podzielny przez 16
  75. dmaConfig.count = 2;
  76. dmaConfig.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD;
  77. dmaConfig.consSckId = CY_U3P_LPP_SOCKET_UART_CONS;
  78. dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE;
  79. dmaConfig.notification = CY_U3P_DMA_CB_PROD_EVENT;
  80. dmaConfig.cb = UART_receivedMessage;
  81. dmaConfig.prodHeader = 0;
  82. dmaConfig.prodFooter = 0;
  83. dmaConfig.consHeader = 0;
  84. dmaConfig.prodAvailCount = 0;
  85.  
  86. //utworzenie kanalu DMA dla UART'a
  87. CyU3PDmaChannelCreate(&channelForUART, CY_U3P_DMA_TYPE_MANUAL, &dmaConfig);
  88.  
  89. //ustawienie nieskoczonej transmisji w kanale DMA
  90. CyU3PDmaChannelSetXfer(&channelForUART, 0);
  91. #endif
  92.  
  93. //ustawienie nieskonczonej transmisji na TX i RX
  94. CyU3PUartTxSetBlockXfer(0xFFFFFFFF);
  95. CyU3PUartRxSetBlockXfer(0xFFFFFFFF);
  96.  
  97. #ifndef SCPI
  98. CyU3PDebugInit(CY_U3P_LPP_SOCKET_UART_CONS, 255);
  99. CyU3PDebugPrint(0, "Hello USB 3.1. Gotowy do debugowania!\r\n");
  100. #endif
  101.  
  102. }
  103.  
  104.  
  105.  
  106. //funkcja wywolywana po oproznieniu bufora, wyslaniu danych na porcie USB
  107. void USB_bufferEmpty(CyU3PDmaChannel *channel, CyU3PDmaCbType_t type, CyU3PDmaCBInput_t *input)
  108. {
  109.  
  110. CyU3PDmaBuffer_t buffer = input->buffer_p;
  111. if (type == CY_U3P_DMA_CB_CONS_EVENT)
  112. {
  113. int i;
  114. CyU3PDmaChannelGetBuffer(channel, &buffer, 0);
  115.  
  116. for(i = 0; i < 1024; ++i){
  117. buffer.buffer[i] = znak;
  118. }
  119.  
  120. CyU3PDmaChannelCommitBuffer(channel, 1024, 0);
  121. if(znak++ == 'Z'){
  122. znak ='A';
  123. }
  124.  
  125.  
  126.  
  127. //STUDENT - Zadanie 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  128. }
  129. }
  130.  
  131.  
  132. void USB_init()
  133. {
  134. //uruchomienie modulu USB
  135. CyU3PUsbStart();
  136.  
  137. //konfiguracja izochronicznego punktu koncowego
  138. CyU3PEpConfig_t epConfig;
  139. //STUDENT - Zadanie 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  140. //po ustawieniu setdown end point config, dokumentacja pol struktury platforma
  141.  
  142. CyU3PMemSet((uint8_t)&epConfig, 0, sizeof(epConfig));
  143. epConfig.pcktSize = 1024;
  144. epConfig.burstLen = 1;
  145. epConfig.streams = 0;
  146. epConfig.enable = CyTrue;
  147. epConfig.epType = CY_U3P_USB_EP_ISO;
  148. epConfig.isoPkts = 1;
  149. CyU3PSetEpConfig(CY_FX_EP_CONSUMER, &epConfig);
  150.  
  151. //oproznienie punktu koncowego
  152. CyU3PUsbFlushEp(CY_FX_EP_CONSUMER);
  153.  
  154. //konfiguracja kanalu DMA
  155. CyU3PDmaChannelConfig_t dmaConfig;
  156. CyU3PMemSet((uint8_t *)&dmaConfig, 0, sizeof(dmaConfig));
  157. dmaConfig.size = 1024; //wielokrotnosc 16
  158. dmaConfig.count = 2;
  159. dmaConfig.prodSckId = CY_U3P_CPU_SOCKET_PROD;
  160. dmaConfig.consSckId = CY_FX_EP_CONSUMER_SOCKET;
  161. dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE;
  162. dmaConfig.notification = CY_U3P_DMA_CB_CONS_EVENT;
  163. dmaConfig.cb = USB_bufferEmpty;
  164.  
  165. //utworzenie kanalu DMA dla USB
  166. CyU3PDmaChannelCreate(&channelForUSB, CY_U3P_DMA_TYPE_MANUAL_OUT, &dmaConfig);
  167.  
  168. //ustawienie nieskonczonej transmisji w kanale DMA dla USB
  169. CyU3PDmaChannelSetXfer(&channelForUSB, 0);
  170.  
  171. //wstepne wypelnienie buforow w kanale DMA dla USB
  172. //STUDENT - Zadanie 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  173. // get,memset,commitbuffer
  174. // smieci w buforach 2x petle zeby wykosic
  175.  
  176. CyU3PDmaBuffer_t buffer;
  177. CyU3PReturnStatus_t buffStatus = CyU3PDmaChannelGetBuffer(&channelForUSB, &buffer, 0);
  178. int i;
  179.  
  180. //CyU3PDebugPrint(0, "status: %d", buffStatus);
  181. for(i = 0; i < 1024; ++i) {
  182. buffer.buffer[i] = 'G';
  183. }
  184. CyU3PDmaChannelCommitBuffer(&channelForUSB, 1024, 0);
  185.  
  186. buffStatus = CyU3PDmaChannelGetBuffer(&channelForUSB, &buffer, 0);
  187. //CyU3PDebugPrint(0, "status: %d", buffStatus);
  188. for(i = 0; i < 1024; ++i) {
  189. buffer.buffer[i] = 'M';
  190. }
  191. CyU3PDmaChannelCommitBuffer(&channelForUSB, 1024, 0);
  192.  
  193.  
  194.  
  195. //zaladowanie deskryptorow
  196. CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_DEVICE_DESCR, NULL, (uint8_t *)CyFxUSB30DeviceDscr);
  197. CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_DEVICE_DESCR, NULL, (uint8_t *)CyFxUSB20DeviceDscr);
  198. CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_BOS_DESCR, NULL, (uint8_t *)CyFxUSBBOSDscr);
  199. CyU3PUsbSetDesc(CY_U3P_USB_SET_SS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBSSConfigDscr);
  200. CyU3PUsbSetDesc(CY_U3P_USB_SET_HS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBHSConfigDscr);
  201. CyU3PUsbSetDesc(CY_U3P_USB_SET_FS_CONFIG_DESCR, NULL, (uint8_t *)CyFxUSBFSConfigDscr);
  202. CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 0, (uint8_t *)CyFxUSBStringLangIDDscr);
  203. CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 1, (uint8_t *)CyFxUSBManufactureDscr);
  204. CyU3PUsbSetDesc(CY_U3P_USB_SET_STRING_DESCR, 2, (uint8_t *)CyFxUSBProductDscr);
  205.  
  206. //aktywacja pinow portu USB
  207. CyU3PConnectState(CyTrue, CyTrue);
  208.  
  209. //zablokowanie przejscia do stanow U1 i U2
  210. CyU3PUsbLPMDisable();
  211. }
  212.  
  213. //funkcja wejsciowa watku
  214. void startThread(uint32_t input)
  215. {
  216. //inicjalizacja UARTa
  217. UART_init();
  218.  
  219. //inicjalizacja USB
  220. USB_init();
  221.  
  222. //oczekiwanie na zdarzenie (asynchroniczne)
  223. while(1);
  224. }
  225.  
  226. //funkcja wywolywana po zaladowaniu systemu ThreadX
  227. void CyFxApplicationDefine()
  228. {
  229. //utworzenie watku aplikacji w systemie ThreadX
  230. CyU3PThreadCreate(&thread, //struktura dla watku
  231. "ISO", //nazwa watku
  232. startThread, //implementacja watku
  233. 0, //brak prarametrow
  234. CyU3PMemAlloc(4096), //stos o rozmiarze 4kB
  235. 4096, //rozmiar stosu
  236. 7, //priorytet watku
  237. 7, //priorytet wywlaszczenia
  238. 0, //brak ograniczenia na czas realizacji
  239. 1 //automatyczny start
  240. );
  241.  
  242. }
  243.  
  244. //glowna funkcja
  245. int main()
  246. {
  247. //inicjalizacja urzadzenia
  248. CyU3PDeviceInit(NULL);
  249.  
  250. //inicjalizacja pamieci podrecznych
  251. CyU3PDeviceCacheControl(CyTrue, CyTrue, CyTrue);
  252.  
  253. //konfiguracja portow
  254. CyU3PIoMatrixConfig_t io_cfg;
  255. io_cfg.isDQ32Bit = CyFalse;
  256. io_cfg.s0Mode = CY_U3P_SPORT_INACTIVE;
  257. io_cfg.s1Mode = CY_U3P_SPORT_INACTIVE;
  258. io_cfg.useUart = CyTrue;
  259. io_cfg.useI2C = CyFalse;
  260. io_cfg.useI2S = CyFalse;
  261. io_cfg.useSpi = CyFalse;
  262. io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_UART_ONLY;
  263. io_cfg.gpioSimpleEn[0] = 0;
  264. io_cfg.gpioSimpleEn[1] = 0;
  265. io_cfg.gpioComplexEn[0] = 0;
  266. io_cfg.gpioComplexEn[1] = 0;
  267. CyU3PDeviceConfigureIOMatrix (&io_cfg);
  268.  
  269. //zaladowanie jadra systemu ThreadX
  270. CyU3PKernelEntry();
  271.  
  272. return 0;
  273.  
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement