Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
75
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. //******************************************************************************************************//
  12.  
  13. //***********************************************TO DO 2*************************************************//
  14. //*********************Definirati konstante PS2_DEVICE_ID, INTC_DEVICE_ID i INTR_ID**********************//
  15. #define PS2_DEVICE_ID XPAR_PS2_0_DEVICE_ID
  16. #define INTC_DEVICE_ID XPAR_XPS_INTC_0_DEVICE_ID
  17. #define INTR_ID XPAR_INTC_0_PS2_0_VEC_ID
  18.  
  19. //******************************************************************************************************//
  20.  
  21. /*************************** Definiranje makroa *****************************/
  22. #define printf xil_printf
  23.  
  24. /************************** Prototipi funkcija ******************************/
  25.  
  26. int Ps2IntrExample(XIntc* IntcInstPtr, XPs2* Ps2InstPtr, u16 Ps2DeviceId, u8 Ps2IntrId);
  27.  
  28. static void Ps2IntrHandler(void *CallBackRef, u32 Event, u32 EventData);
  29.  
  30. static int Ps2SetupIntrSystem(XIntc* IntcInstPtr, XPs2 *Ps2Ptr, u8 IntrId);
  31.  
  32. //***********************************************TO DO 3*************************************************//
  33. //*********************************Deklarirati varijable Ps2Inst i IntcInst******************************//
  34. XPs2 Ps2Inst;
  35. XIntc IntcInst;
  36. //******************************************************************************************************//
  37.  
  38. //Varijable koje se koriste u prekidnoj rutini
  39. volatile static int RxDataRecv = FALSE;     /* Flag to indicate Receive Data */
  40. volatile static int RxError = FALSE;        /* Flag to indicate Receive Error */
  41. volatile static int RxOverFlow = FALSE;     /* Flag to indicate Receive Overflow */
  42. volatile static int TxDataSent = FALSE;     /* Flag to indicate Tx Data sent */
  43. volatile static int TxNoAck = FALSE;        /* Flag to indicate Tx No Ack */
  44. volatile static int TimeOut = FALSE;        /* Flag to indicate Watchdog Timeout */
  45. volatile static int TxNumBytes = 0;         /* Number of bytes transmitted */
  46. volatile static int RxNumBytes = 0;         /* Number of bytes received */
  47.  
  48. //***********************************************TO DO 4*************************************************//
  49. //************************************Deklarirati varijablu RxBuffer*************************************//
  50. u8 RxBuffer;
  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.  
  136.     //Beskonačna petlja
  137.     while(1)
  138.     {
  139.  
  140.     }
  141.  
  142.     //Onemogućavanje prekida za prijem i globalno onemogućavanje prekida u XPS PS2 kontroleru
  143.     //XPs2_IntrDisable(&Ps2Inst, XPS2_IPIXR_ALL);
  144.     //XPs2_IntrGlobalDisable(&Ps2Inst);
  145.  
  146.     return XST_SUCCESS;
  147. }
  148.  
  149. /*****************************************************************************/
  150. /**
  151. * Prekidna rutina koja se poziva od strane procesora u slučajevima kada XPS PS2
  152. * kontroler generira jedan od sljedećih prekida:
  153. *   - Primanje podataka     (Receive Data Interrupt)
  154. *   - Primanje pogreške     (Receive Error Interrupt)
  155. *   - Primanje prelijevanja (Receive Overflow Interrupt)
  156. *   - Slanje podataka       (Transmit Data Interrupt)
  157. *   - Ne primanje ACK       (Transmit No ACK Interrupt)
  158. *   - Watchdog timeout      (Watchdog Timeout Interrupt)
  159. *
  160. * @param    CallBackRef je callback referenca koja se prosljeđuje u prekidnu
  161. *           rutinu.
  162. * @param    IntrMask je maska koja govori koji je događaj izazvao prekid.
  163. *           U datoteci xps2_l.h se nalaze konstante XPS2_IPIXR_* kojima se
  164. *           objašnjavaju događaji koji su izazvali prekid:
  165. *       - XPS2_IPIXR_RX_FULL za Primanje podataka
  166. *       - XPS2_IPIXR_RX_ERR za Primanje pogreške
  167. *       - XPS2_IPIXR_RX_OVF za Primanje prelijevanja
  168. *       - XPS2_IPIXR_TX_ACK za Slanje podataka
  169. *       - XPS2_IPIXR_TX_NOACK za Ne primanje ACK
  170. *       - XPS2_IPIXR_WDT_TOUT za Watchdog timeout
  171. * @param    ByteCount sadrži broj bytova koji su primljeni ili poslani u
  172. *           trenutku poziva.
  173. *
  174. * @return   None.
  175. *
  176. * @note     None.*
  177. ******************************************************************************/
  178. static void Ps2IntrHandler(void *CallBackRef, u32 IntrMask, u32 ByteCount)
  179. {
  180.     //***********************************************TO DO 10*************************************************//
  181.     //********************************Primiti 1 byte podataka putem PS2 sucelja*******************************//
  182.     XPs2_Recv(&Ps2Inst, &RxBuffer, 1);
  183.  
  184.     //********************************************************************************************************//
  185.  
  186.     //Podatak je primljen.
  187.     if (IntrMask & XPS2_IPIXR_RX_FULL) {
  188.  
  189.         RxDataRecv = TRUE;
  190.         RxNumBytes = ByteCount;
  191.  
  192.         printf("%x\r\n", RxBuffer);
  193.         //printf ("Interrupt mask: XPS2_IPIXR_RX_FULL\r\n");
  194.     }
  195.  
  196.     //Primljena je pogreška.
  197.     if (IntrMask & XPS2_IPIXR_RX_ERR) {
  198.  
  199.         RxError = TRUE;
  200.         //printf ("Interrupt mask: XPS2_IPIXR_RX_ERR\r\n");
  201.     }
  202.  
  203.     //Primljen prelijev.
  204.     if (IntrMask & XPS2_IPIXR_RX_OVF) {
  205.  
  206.         RxOverFlow = TRUE;
  207.         //printf ("Interrupt mask: XPS2_IPIXR_RX_OVF\r\n");
  208.     }
  209.  
  210.     //Transmission of the specified data is completed.
  211.     if (IntrMask & XPS2_IPIXR_TX_ACK) {
  212.  
  213.         TxDataSent = TRUE;
  214.         TxNumBytes = ByteCount;
  215.         //printf ("Interrupt mask: XPS2_IPIXR_TX_ACK\r\n");
  216.     }
  217.  
  218.     //Nije poslan ACK.
  219.     if (IntrMask & XPS2_IPIXR_TX_NOACK) {
  220.  
  221.         TxNoAck = TRUE;
  222.         //printf ("Interrupt mask: XPS2_IPIXR_TX_NOACK\r\n");
  223.     }
  224.  
  225.     //Timeout slanaja.
  226.     if (IntrMask & XPS2_IPIXR_WDT_TOUT) {
  227.  
  228.         TimeOut = TRUE;
  229.         //printf ("Interrupt mask: XPS2_IPIXR_WDT_TOUT\r\n");
  230.     }
  231. }
  232.  
  233. /****************************************************************************/
  234. /**
  235. * Funkcija za postaljanje sustava prekida tako da se oni mogu dogoditi za
  236. * XPS PS2 kontroler.
  237. *
  238. * @param    IntcInstPtr je pokazivač na varijablu tipa XIntc.
  239. * @param    Ps2Ptr je pokazivač na varijablu tipa XPs2 koja će biti povezana
  240. *           s upravljačem prekida.
  241. * @param    IntrId je konstanta XPAR_<INTC_instance>_<PS2_instance>_VEC_ID iz
  242. *           datoteke xparameters.h.
  243. *
  244. * @return   XST_SUCCESS ako je uspješno završena ili XST_FAILURE u suprotnom.
  245. *
  246. * @note     None.
  247. *
  248. ****************************************************************************/
  249. static int Ps2SetupIntrSystem(XIntc* IntcInstPtr, XPs2 *Ps2Ptr, u8 IntrId )
  250. {
  251.     int Status;
  252.  
  253.  
  254.     //**********************************************TO DO 11*************************************************//
  255.     //****Inicijalizirati upravljač prekidima, povratnu vrijednost funkcije spremiti u varijablu Status******//
  256.     Status = XIntc_Initialize(IntcInstPtr, INTC_DEVICE_ID);
  257.  
  258.     //*******************************************************************************************************//
  259.     if (Status != XST_SUCCESS) {
  260.         return XST_FAILURE;
  261.     }
  262.  
  263.     //Povezivanje kontrolera s prekidnom rutinom
  264.     Status = XIntc_Connect(IntcInstPtr,
  265.                 IntrId,
  266.                 (XInterruptHandler) XPs2_IntrHandler,
  267.                 Ps2Ptr);
  268.     if (Status != XST_SUCCESS) {
  269.         return XST_FAILURE;
  270.     }
  271.     //***********************************************TO DO 12*****************************+****************//
  272.     //***Postaviti mod rada upravljača prekida, povratnu vrijednost funkcije spremiti u varijablu Status***//
  273.     Status = XIntc_Start(IntcInstPtr, XIN_REAL_MODE);
  274.  
  275.     //*****************************************************************************************************//
  276.     if (Status != XST_SUCCESS) {
  277.         return XST_FAILURE;
  278.     }
  279.  
  280.     //**********************************************TO DO 13******************************+****************//
  281.     //*********************************Omogućiti rad upravljača prekidima**********************************//
  282.     XIntc_Enable(IntcInstPtr, IntrId);
  283.  
  284.     //*****************************************************************************************************//
  285.  
  286.     //Inicijalizacija iznimaka
  287.     Xil_ExceptionInit();
  288.  
  289.     //Povezivanje prekidne rutine s iznimkama
  290.     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  291.                 (Xil_ExceptionHandler) XIntc_InterruptHandler,
  292.                 IntcInstPtr);
  293.  
  294.     //Omogućavanje iznimki
  295.     Xil_ExceptionEnable();
  296.  
  297.     return XST_SUCCESS;
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement