requestIrq();
//暂时禁止所有中断,等到open时再打开
disable_irq(IRQ_EINT1);
disable_irq(IRQ_EINT3);
disable_irq(IRQ_EINT8);
return 0;
}
/*----------------------------------------------------
* func: 注销字符设备,释放中断
* param:
*
*
* return:
*
------------------------------------------------------*/
static void __exit s3c2440_kb_exit(void)
{
/*注销设备*/
unregister_chrdev(kbMajor, DEVICE_NAME);
printk("exit\n");
/*释放中断*/
free_irq(IRQ_EINT1,NULL);
free_irq(IRQ_EINT8,NULL);
free_irq(IRQ_EINT3,NULL);
}
module_init(s3c2440_kb_init);
module_exit(s3c2440_kb_exit);
//EXPORT_SYMBOL(s3c2440_kb_init);
//EXPORT_SYMBOL(s3c2440_kb_exit);
如果将此驱动和qtopia程序结合起来,需要修改qt源代码的qkeyboard_qws.cpp文件,添加对矩阵键盘的支持
class QWSHPCButtonsHandler : public QWSKeyboardHandler
{
Q_OBJECT
public:
QWSHPCButtonsHandler();
virtual ~QWSHPCButtonsHandler();
bool isOpen() { return buttonFD > 0; }
private slots:
void readKeyboardData();
private:
QString terminalName;
int buttonFD;
struct termios newT, oldT;
QSocketNotifier *notifier;
};
QWSHPCButtonsHandler::QWSHPCButtonsHandler() : QWSKeyboardHandler()
{
#ifdef QT_QWS_HPC
terminalName = "/dev/keyboard";
notifier = 0;
if ((buttonFD = open(terminalName, O_RDONLY | O_NDELAY, 0)) < 0) {
qWarning("Cannot open %s\n", terminalName.latin1());
return;
}
notifier = new QSocketNotifier( buttonFD, QSocketNotifier::Read, this );
connect( notifier, SIGNAL(activated(int)),this,
SLOT(readKeyboardData()) );
#endif
}
QWSHPCButtonsHandler::~QWSHPCButtonsHandler()
{
#ifdef QT_QWS_HPC
if ( buttonFD > 0 ) {
::close( buttonFD );
buttonFD = -1;
}
#endif
}
void QWSHPCButtonsHandler::readKeyboardData()
{
#ifdef QT_QWS_HPC
//-----------port form ButtonDetect-begin-----------
int tempint,i;
unsigned short buffer[1];
tempint=0;
int current_press=-1;
do{
tempint=read(buttonFD,buffer,1);
if(tempint > 0 )
{
// printf("\nCurrent Press Buttom %d \n",buffer[0]);
current_press = (int)buffer[1];
goto set_hpckey;
}
}while(tempint >0);
//-----------port form ButtonDetect-end-------------
set_hpckey:
int k=(-1);
switch(current_press) {
case 3: k=Qt::Key_Up; break; //
case 11: k=Qt::Key_Down; break; //
case 8: k=Qt::Key_Left; break; //
case 6: k=Qt::Key_Right; break; //
case 7: k=Qt::Key_Enter; break; // Enter
case 4: k=Qt::Key_Escape; break; // Enter
default: k=(-1); break;
}
if ( k >= 0 )
{
qwsServer->processKeyEvent( 0, k, 0, 1, false );
}
#endif
}