Advertisement
Domy131097

lv5_ps2_interrupt.c

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