Linux和qtopia下的矩阵键盘驱动程序(五)

2014-11-24 09:12:45 · 作者: · 浏览: 2
: major number=99\n",DEVICE_NAME);

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";
buttonFD = -1;
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
}