Advertisement
B-Matt

Microblaze Application - Interrupt Counter PS2

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