Advertisement
filip710

lv5z2

Dec 14th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.13 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "xil_exception.h"
  3. #include "xstatus.h"
  4. //***********************************************TO DO 1*************************************************//
  5. //*************************Uključiti datoteke xparameters.h, xps2.h, xintc.h ****************************//
  6. #include "xparameters.h"
  7. #include "xps2.h"
  8. #include "xintc.h"
  9. //******************************************************************************************************//
  10.  
  11. //***********************************************TO DO 2*************************************************//
  12. //*********************Definirati konstante PS2_DEVICE_ID, INTC_DEVICE_ID i INTR_ID**********************//
  13. #define PS2_DEVICE_ID XPAR_PS2_0_DEVICE_ID
  14. #define INTC_DEVICE_ID XPAR_XPS_INTC_0_DEVICE_ID
  15. #define INTR_ID XPAR_INTC_0_PS2_0_VEC_ID
  16.  
  17. //******************************************************************************************************//
  18.  
  19. /*************************** Definiranje makroa *****************************/
  20. #define printf xil_printf
  21.  
  22. /************************** Prototipi funkcija ******************************/
  23.  
  24. int Ps2IntrExample(XIntc* IntcInstPtr, XPs2* Ps2InstPtr, u16 Ps2DeviceId, u8 Ps2IntrId);
  25.  
  26. static void Ps2IntrHandler(void *CallBackRef, u32 Event, u32 EventData);
  27.  
  28. static int Ps2SetupIntrSystem(XIntc* IntcInstPtr, XPs2 *Ps2Ptr, u8 IntrId);
  29.  
  30. //***********************************************TO DO 3*************************************************//
  31. //*********************************Deklarirati varijable Ps2Inst i IntcInst******************************//
  32. XPs2 Ps2Inst;
  33. XIntc IntcInst;
  34.  
  35. //******************************************************************************************************//
  36.  
  37. //Varijable koje se koriste u prekidnoj rutini
  38. volatile static int RxDataRecv = FALSE;     /* Flag to indicate Receive Data */
  39. volatile static int RxError = FALSE;        /* Flag to indicate Receive Error */
  40. volatile static int RxOverFlow = FALSE;     /* Flag to indicate Receive Overflow */
  41. volatile static int TxDataSent = FALSE;     /* Flag to indicate Tx Data sent */
  42. volatile static int TxNoAck = FALSE;        /* Flag to indicate Tx No Ack */
  43. volatile static int TimeOut = FALSE;        /* Flag to indicate Watchdog Timeout */
  44. volatile static int TxNumBytes = 0;         /* Number of bytes transmitted */
  45. volatile static int RxNumBytes = 0;         /* Number of bytes received */
  46.  
  47. //***********************************************TO DO 4*************************************************//
  48. //************************************Deklarirati varijablu RxBuffer*************************************//
  49. u8 RxBuffer;
  50.  
  51. //*******************************************************************************************************//
  52.  
  53. int main(void)
  54. {
  55.     int Status;
  56.  
  57. //***********************************************TO DO 5*************************************************//
  58. //******Pozvati funkciju Ps2IntrExample, povratnu vrijednost funkcije spremiti u varijablu Status********//
  59.     Status = Ps2IntrExample(&IntcInst, &Ps2Inst, PS2_DEVICE_ID, INTR_ID);
  60.  
  61. //*******************************************************************************************************//
  62.  
  63.     if (Status != XST_SUCCESS) {
  64.         return XST_FAILURE;
  65.     }
  66.  
  67.     return XST_SUCCESS;
  68.  
  69. }
  70.  
  71. /****************************************************************************/
  72. /**
  73. *
  74. * Ova funkcija je primjer inicijalizacije i komunikacije s tipkovnicom u interrupt načinu rada.
  75. * APIs.
  76. *
  77. *
  78. * @param    IntcInstPtr je pokazivač na varijablu tipa XIntc.
  79. * @param    Ps2InstPtr je pokazivač na varijablu tipa XPs2.
  80. * @param    Ps2DeviceId je device id XPS PS2 kontrolera iz datoteke xparameters.h.
  81. * @param    Ps2IntrId je vrijednost konstante XPAR_<INTC_instance>_<PS2_instance>_VEC_ID iz datoteke xparameters.h.
  82. * @return
  83. *       - XST_SUCCESS ako je funkcija završio uspješno.
  84. *       - XST_FAILURE ako je funkcija nije završila uspješno.
  85. *
  86. * @note     Funkcija nikada neće vratiti XST_SUCCESS ukoliko se ne implementira prekid beskonačne petlje.
  87. ****************************************************************************/
  88. int Ps2IntrExample(XIntc* IntcInstPtr, XPs2* Ps2InstPtr,
  89.             u16 Ps2DeviceId, u8 Ps2IntrId)
  90. {
  91.     int Status;
  92.     XPs2_Config *ConfigPtr;
  93.  
  94.     //***********************************************TO DO 6*************************************************//
  95.     //******Dohvatiti konfiguraciju PS2 sučelja, povratnu vrijednost spremiti u varijablu ConfigPtr**********//
  96.     ConfigPtr = XPs2_LookupConfig(Ps2DeviceId);
  97.  
  98.     //*******************************************************************************************************//
  99.     if (ConfigPtr == NULL) {
  100.         return XST_FAILURE;
  101.     }
  102.  
  103.     //***********************************************TO DO 7*************************************************//
  104.     //*************************************Inicijalizirati PS2 kontroler*************************************//
  105.     XPs2_CfgInitialize(Ps2InstPtr, ConfigPtr, ConfigPtr->BaseAddress);
  106.  
  107.     //*******************************************************************************************************//
  108.  
  109.     //Self Test PS/2 uređaja
  110.     Status = XPs2_SelfTest(Ps2InstPtr);
  111.     if (Status != XST_SUCCESS) {
  112.         return XST_FAILURE;
  113.     }
  114.  
  115.     //***********************************************TO DO 8*************************************************//
  116.     //*******Pozvati funkciju Ps2SetupIntrSystem, povratnu vrijednost spremiti u varijablu Status************//
  117.     Status = Ps2SetupIntrSystem(IntcInstPtr, Ps2InstPtr, Ps2IntrId);
  118.  
  119.     //*******************************************************************************************************//
  120.     if (Status != XST_SUCCESS) {
  121.         return XST_FAILURE;
  122.     }
  123.  
  124.     //Postavljanje prekidne rutine
  125.     XPs2_SetHandler(&Ps2Inst, (XPs2_Handler)Ps2IntrHandler, &Ps2Inst);
  126.  
  127.     //***********************************************TO DO 9*************************************************//
  128.     //******Omogućiti prekide za prijem podataka i globalno omogućiti prekide u XPS PS2 kontroleru***********//
  129.     XPs2_IntrEnable(Ps2InstPtr, XPS2_IPIXR_RX_ALL);
  130.     XPs2_IntrGlobalEnable(Ps2InstPtr);
  131.  
  132.     //*******************************************************************************************************//
  133.  
  134.     printf("\r\n Press Keys on the keyboard \r\n");
  135.     //Beskonačna petlja
  136.     while(1)
  137.     {
  138.     }
  139.  
  140.     //Onemogućavanje prekida za prijem i globalno onemogućavanje prekida u XPS PS2 kontroleru
  141.     //XPs2_IntrDisable(&Ps2Inst, XPS2_IPIXR_ALL);
  142.     //XPs2_IntrGlobalDisable(&Ps2Inst);
  143.  
  144.     return XST_SUCCESS;
  145. }
  146.  
  147. /*****************************************************************************/
  148. /**
  149. * Prekidna rutina koja se poziva od strane procesora u slučajevima kada XPS PS2
  150. * kontroler generira jedan od sljedećih prekida:
  151. *   - Primanje podataka     (Receive Data Interrupt)
  152. *   - Primanje pogreške     (Receive Error Interrupt)
  153. *   - Primanje prelijevanja (Receive Overflow Interrupt)
  154. *   - Slanje podataka       (Transmit Data Interrupt)
  155. *   - Ne primanje ACK       (Transmit No ACK Interrupt)
  156. *   - Watchdog timeout      (Watchdog Timeout Interrupt)
  157. *
  158. * @param    CallBackRef je callback referenca koja se prosljeđuje u prekidnu
  159. *           rutinu.
  160. * @param    IntrMask je maska koja govori koji je događaj izazvao prekid.
  161. *           U datoteci xps2_l.h se nalaze konstante XPS2_IPIXR_* kojima se
  162. *           objašnjavaju događaji koji su izazvali prekid:
  163. *       - XPS2_IPIXR_RX_FULL za Primanje podataka
  164. *       - XPS2_IPIXR_RX_ERR za Primanje pogreške
  165. *       - XPS2_IPIXR_RX_OVF za Primanje prelijevanja
  166. *       - XPS2_IPIXR_TX_ACK za Slanje podataka
  167. *       - XPS2_IPIXR_TX_NOACK za Ne primanje ACK
  168. *       - XPS2_IPIXR_WDT_TOUT za Watchdog timeout
  169. * @param    ByteCount sadrži broj bytova koji su primljeni ili poslani u
  170. *           trenutku poziva.
  171. *
  172. * @return   None.
  173. *
  174. * @note     None.*
  175. ******************************************************************************/
  176. static void Ps2IntrHandler(void *CallBackRef, u32 IntrMask, u32 ByteCount)
  177. {
  178.     //***********************************************TO DO 10*************************************************//
  179.     //********************************Primiti 1 byte podataka putem PS2 sucelja*******************************//
  180.     XPs2_Recv(&Ps2Inst, &RxBuffer, 1);
  181.  
  182.     //********************************************************************************************************//
  183.  
  184.     //Podatak je primljen.
  185.     if (IntrMask & XPS2_IPIXR_RX_FULL) {
  186.  
  187.         RxDataRecv = TRUE;
  188.         RxNumBytes = ByteCount;
  189.  
  190.         printf("%x\r\n", RxBuffer);
  191.         //printf ("Interrupt mask: XPS2_IPIXR_RX_FULL\r\n");
  192.     }
  193.  
  194.     //Primljena je pogreška.
  195.     if (IntrMask & XPS2_IPIXR_RX_ERR) {
  196.  
  197.         RxError = TRUE;
  198.         //printf ("Interrupt mask: XPS2_IPIXR_RX_ERR\r\n");
  199.     }
  200.  
  201.     //Primljen prelijev.
  202.     if (IntrMask & XPS2_IPIXR_RX_OVF) {
  203.  
  204.         RxOverFlow = TRUE;
  205.         //printf ("Interrupt mask: XPS2_IPIXR_RX_OVF\r\n");
  206.     }
  207.  
  208.     //Transmission of the specified data is completed.
  209.     if (IntrMask & XPS2_IPIXR_TX_ACK) {
  210.  
  211.         TxDataSent = TRUE;
  212.         TxNumBytes = ByteCount;
  213.         //printf ("Interrupt mask: XPS2_IPIXR_TX_ACK\r\n");
  214.     }
  215.  
  216.     //Nije poslan ACK.
  217.     if (IntrMask & XPS2_IPIXR_TX_NOACK) {
  218.  
  219.         TxNoAck = TRUE;
  220.         //printf ("Interrupt mask: XPS2_IPIXR_TX_NOACK\r\n");
  221.     }
  222.  
  223.     //Timeout slanaja.
  224.     if (IntrMask & XPS2_IPIXR_WDT_TOUT) {
  225.  
  226.         TimeOut = TRUE;
  227.         //printf ("Interrupt mask: XPS2_IPIXR_WDT_TOUT\r\n");
  228.     }
  229. }
  230.  
  231. /****************************************************************************/
  232. /**
  233. * Funkcija za postaljanje sustava prekida tako da se oni mogu dogoditi za
  234. * XPS PS2 kontroler.
  235. *
  236. * @param    IntcInstPtr je pokazivač na varijablu tipa XIntc.
  237. * @param    Ps2Ptr je pokazivač na varijablu tipa XPs2 koja će biti povezana
  238. *           s upravljačem prekida.
  239. * @param    IntrId je konstanta XPAR_<INTC_instance>_<PS2_instance>_VEC_ID iz
  240. *           datoteke xparameters.h.
  241. *
  242. * @return   XST_SUCCESS ako je uspješno završena ili XST_FAILURE u suprotnom.
  243. *
  244. * @note     None.
  245. *
  246. ****************************************************************************/
  247. static int Ps2SetupIntrSystem(XIntc* IntcInstPtr, XPs2 *Ps2Ptr, u8 IntrId )
  248. {
  249.     int Status;
  250.  
  251.  
  252.     //**********************************************TO DO 11*************************************************//
  253.     //****Inicijalizirati upravljač prekidima, povratnu vrijednost funkcije spremiti u varijablu Status******//
  254.     Status = XIntc_Initialize(IntcInstPtr, INTC_DEVICE_ID);
  255.  
  256.     //*******************************************************************************************************//
  257.     if (Status != XST_SUCCESS) {
  258.         return XST_FAILURE;
  259.     }
  260.  
  261.     //Povezivanje kontrolera s prekidnom rutinom
  262.     Status = XIntc_Connect(IntcInstPtr,
  263.                 IntrId,
  264.                 (XInterruptHandler) XPs2_IntrHandler,
  265.                 Ps2Ptr);
  266.     if (Status != XST_SUCCESS) {
  267.         return XST_FAILURE;
  268.     }
  269.  
  270.     //***********************************************TO DO 12*****************************+****************//
  271.     //***Postaviti mod rada upravljača prekida, povratnu vrijednost funkcije spremiti u varijablu Status***//
  272.     Status = XIntc_Start(IntcInstPtr, XIN_REAL_MODE);
  273.  
  274.     //*****************************************************************************************************//
  275.     if (Status != XST_SUCCESS) {
  276.         return XST_FAILURE;
  277.     }
  278.  
  279.     //**********************************************TO DO 13******************************+****************//
  280.     //*********************************Omogućiti rad upravljača prekidima**********************************//
  281.     XIntc_Enable(IntcInstPtr, IntrId);
  282.  
  283.     //*****************************************************************************************************//
  284.  
  285.     //Inicijalizacija iznimaka
  286.     Xil_ExceptionInit();
  287.  
  288.     //Povezivanje prekidne rutine s iznimkama
  289.     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  290.                 (Xil_ExceptionHandler) XIntc_InterruptHandler,
  291.                 IntcInstPtr);
  292.  
  293.     //Omogućavanje iznimki
  294.     Xil_ExceptionEnable();
  295.  
  296.     return XST_SUCCESS;
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement