Advertisement
B-Matt

Microblaze Application - Interrupt PS2 & LEDs

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