ps 2键盘代码 c语言,MicroBlaze中断编程——以PS/2键盘输入为例

该代码实现了一个初始化输入中断处理的程序,主要涉及PS/2控制器和中断控制器的配置。初始化过程中,设置了PS/2控制器的中断使能,并连接了中断控制器的设备驱动处理函数,用于处理键盘和鼠标中断事件。在中断处理函数中,读取设备状态并调用相应的事件处理器。
摘要由CSDN通过智能技术生成

/*

*Date      2010-12-27

*author    Qi Yao

*decription main function code for interrupt program

*           such as timer or keyboard and mouse interrupt.

*/

/* FPGA includes */

#include      /* for printf */

#include     /* for usleep */

#include “xparameters.h”

#include “xutil.h”

#include “xintc.h”

#include “plb_ps2_controller.h”

#include “mb_interface.h”

#define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID

int init_input(void);

XStatus SetUpInterruptSystem(XIntc *XIntcInstancePtr);

static XIntc InterruptController;/*Instance of the Interrupt Control*/

/**

* Input interrupt handler

*/

void PS2_InterruptHandler(void *CallbackRef)

{

u32 mouse_state, keybd_state, flags;

Xuint32 baseaddr = (Xuint32) XPAR_PLB_PS2_CONTROLLER_0_BASEADDR;

/* read information from device registers */

keybd_state = ((u32 *)baseaddr)[0];

mouse_state = ((u32 *)baseaddr)[1];

flags       = PLB_PS2_CONTROLLER_mReadReg(baseaddr, PLB_PS2_CONTROLLER_INTR_IPISR_OFFSET);

if (flags & EVENT_FROM_MOUSE)

/*mouse event handler*/

handle_mouse_event(mouse_state);

if (flags & EVENT_FROM_KEYBD)

/*keyboard event handler*/

handle_keybd_event(keybd_state);

/* clear interrupt flags in PS/2 controller */

PLB_PS2_CONTROLLER_mWriteReg(baseaddr, PLB_PS2_CONTROLLER_INTR_IPISR_OFFSET, flags);

}

XStatus init_input(void)

{

XStatus Status;

Xuint32 baseaddr = (Xuint32) XPAR_PLB_PS2_CONTROLLER_0_BASEADDR;

/* initialize PS/2 interrupts */

PLB_PS2_CONTROLLER_mWriteReg(baseaddr, PLB_PS2_CONTROLLER_INTR_DIER_OFFSET, 0);

PLB_PS2_CONTROLLER_mWriteReg(baseaddr, PLB_PS2_CONTROLLER_INTR_DGIER_OFFSET, 0xFFFFFFFF);

PLB_PS2_CONTROLLER_mWriteReg(baseaddr, PLB_PS2_CONTROLLER_INTR_IPIER_OFFSET, 0xFFFFFFFF);

PLB_PS2_CONTROLLER_mWriteReg(baseaddr, PLB_PS2_CONTROLLER_INTR_IPISR_OFFSET, 0);

/* initialize Interrupt controller */

Status = XIntc_Initialize(&InterruptController, (Xuint16)INTC_DEVICE_ID);

if (Status != XST_SUCCESS)

{        return XST_FAILURE;    }

Status = XIntc_SelfTest(&InterruptController);

if (Status != XST_SUCCESS)

{    return XST_FAILURE;    }

/*

* Connect a device driver handler that will be called when an interrupt

* for the device occurs, the device driver handler performs the specific

* interrupt processing for the device

*/

Status = XIntc_Connect(XIntcInstancePtr, XPAR_XPS_INTC_0_PLB_PS2_CONTROLLER_0_IP2INTC_IRPT_INTR,

(XInterruptHandler)PS2_InterruptHandler,

(void *)0);

if (Status != XST_SUCCESS)

{        return XST_FAILURE;}

/*

* Start the interrupt controller such that interrupts are enabled for

* all devices that cause interrupts, specify simulation mode so that

* an interrupt can be caused by software rather than a real hardware

* interrupt

*/

Status = XIntc_Start(XIntcInstancePtr, XIN_REAL_MODE);

if (Status != XST_SUCCESS)

{

return XST_FAILURE;

}

/*

* Enable the interrupt for the device and then cause (simulate) an

* interrupt so the handlers will be called

*/

XIntc_Enable(XIntcInstancePtr, XPAR_XPS_INTC_0_PLB_PS2_CONTROLLER_0_IP2INTC_IRPT_INTR);

/*

* Enable the Interrupts for the MicroBlaze Processor

*/

microblaze_enable_interrupts();

return XST_SUCCESS;

}

int main(void){

/*Initialization*/

init_input();

/*wait for interrupt*/

while(1);

return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Xilinx MicroBlaze中断定时器的代码示例: ```c #include <stdio.h> #include "xparameters.h" #include "xil_exception.h" #include "xtmrctr_l.h" #define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID #define TMRCTR_INTERRUPT_ID XPAR_INTC_0_TMRCTR_0_VEC_ID volatile int TimerExpired; void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber) { if (XTmrCtr_IsExpired(CallBackRef, TmrCtrNumber)) { XTmrCtr_Reset(CallBackRef, TmrCtrNumber); TimerExpired = 1; } } int SetupInterruptSystem(XTmrCtr *InstancePtr, u16 DeviceId, u16 IntrId) { int Status; XScuGic_Config *IntcConfig; Xil_ExceptionInit(); IntcConfig = XScuGic_LookupConfig(DeviceId); Status = XScuGic_CfgInitialize(&InterruptController, IntcConfig, IntcConfig->CpuBaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &InterruptController); XScuGic_Connect(&InterruptController, IntrId, (Xil_ExceptionHandler)TimerCounterHandler, (void *)InstancePtr); XScuGic_Enable(&InterruptController, IntrId); XTmrCtr_SetHandler(InstancePtr, TimerCounterHandler, InstancePtr); XTmrCtr_SetOptions(InstancePtr, 0, XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION); XTmrCtr_Start(InstancePtr, 0); Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ); return XST_SUCCESS; } int main() { int Status; XTmrCtr TimerCounterInstancePtr; u32 TicksPerSecond = XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ / 2; u32 TimerLoadValue = TicksPerSecond / 2; Status = XTmrCtr_Initialize(&TimerCounterInstancePtr, TMRCTR_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } Status = SetupInterruptSystem(&TimerCounterInstancePtr, INTC_DEVICE_ID, TMRCTR_INTERRUPT_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } XTmrCtr_SetResetValue(&TimerCounterInstancePtr, 0, TimerLoadValue); XTmrCtr_Start(&TimerCounterInstancePtr, 0); while (1) { if (TimerExpired) { printf("Timer expired!\n"); TimerExpired = 0; } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值