鼠标驱动程序的bug真不知道怎么改了...x先放着再说

This commit is contained in:
fslongjin 2022-03-17 23:34:10 +08:00
parent 2bb63e8e87
commit 8272257757
3 changed files with 70 additions and 25 deletions

View File

@ -9,7 +9,8 @@ static struct mouse_input_buffer *mouse_buf_ptr = NULL;
static int c = 0; static int c = 0;
struct apic_IO_APIC_RTE_entry mouse_entry; struct apic_IO_APIC_RTE_entry mouse_entry;
static unsigned char mouse_id = 0; static unsigned char mouse_id = 0;
struct mouse_packet_3bytes pak;
static mouse_count = 0;
/** /**
* @brief * @brief
* *
@ -63,14 +64,14 @@ void mouse_handler(ul irq_num, ul param, struct pt_regs *regs)
if (mouse_buf_ptr->count >= mouse_buffer_size) if (mouse_buf_ptr->count >= mouse_buffer_size)
{ {
// kwarn("mouse input buffer is full."); kwarn("mouse input buffer is full.");
// return; return;
} }
*mouse_buf_ptr->ptr_head = x; *mouse_buf_ptr->ptr_head = x;
++(mouse_buf_ptr->count); ++(mouse_buf_ptr->count);
++(mouse_buf_ptr->ptr_head); ++(mouse_buf_ptr->ptr_head);
//printk("c=%d\tval = %d\n", ++c, x); printk("c=%d\tval = %d\n", ++c, x);
} }
hardware_intr_controller mouse_intr_controller = hardware_intr_controller mouse_intr_controller =
@ -241,8 +242,10 @@ void mouse_init()
for (int j = 0; j < 1000; j++) for (int j = 0; j < 1000; j++)
nop(); nop();
wait_keyboard_write(); wait_keyboard_write();
mouse_enable_5keys(); // mouse_enable_5keys();
mouse_get_mouse_ID(); //mouse_get_mouse_ID();
//mouse_set_sample_rate(100);
mouse_clear_buf();
kdebug("mouse ID:%d", mouse_id); kdebug("mouse ID:%d", mouse_id);
c = 0; c = 0;
} }
@ -265,13 +268,13 @@ void mouse_exit()
*/ */
int mouse_get_packet(void *packet) int mouse_get_packet(void *packet)
{ {
if (mouse_buf_ptr->count != 0) // if (mouse_buf_ptr->count != 0)
kdebug("at get packet: count=%d", mouse_buf_ptr->count); // kdebug("at get packet: count=%d", mouse_buf_ptr->count);
int code = 0; int code = 0;
switch (mouse_id) switch (mouse_id)
{ {
case 0: // 3bytes 数据包 case 0: // 3bytes 数据包
if (mouse_buf_ptr->count < 3) if (mouse_buf_ptr->count < 4)
return EFAIL; return EFAIL;
do do
{ {
@ -296,7 +299,7 @@ int mouse_get_packet(void *packet)
case 3: // 4bytes数据包 case 3: // 4bytes数据包
case 4: case 4:
if (mouse_buf_ptr->count < 4) if (mouse_buf_ptr->count < 5)
return EFAIL; return EFAIL;
do do
{ {
@ -331,4 +334,39 @@ int mouse_get_packet(void *packet)
break; break;
} }
return SUCCESS; return SUCCESS;
}
void analyze_mousecode()
{
if(!mouse_buf_ptr->count)
return;
else printk_color(ORANGE, BLACK, "COUNT=%d\n", mouse_buf_ptr->count);
unsigned char x = mouse_get_scancode();
switch (mouse_count)
{
case 0:
mouse_count++;
break;
case 1:
pak.byte0 = x;
mouse_count++;
break;
case 2:
pak.movement_x = (char)x;
mouse_count++;
break;
case 3:
pak.movement_y = (char)x;
mouse_count = 1;
printk_color(RED, GREEN, "(M:%02x,X:%3d,Y:%3d)\tcount=%d\n", pak.byte0, pak.movement_x, pak.movement_y, mouse_buf_ptr->count);
break;
default:
break;
}
} }

View File

@ -104,4 +104,5 @@ int mouse_set_sample_rate(unsigned int hz);
* @param packet * @param packet
* @return int * @return int
*/ */
int mouse_get_packet(void *packet); int mouse_get_packet(void *packet);
void analyze_mousecode();

View File

@ -180,23 +180,29 @@ void Start_Kernel(void)
// show_welcome(); // show_welcome();
// test_mm(); // test_mm();
/* /*
while (1)
{
keyboard_analyze_keycode();
struct mouse_packet_3bytes packet = {0};
//struct mouse_packet_4bytes packet = {0};
int errcode = 0;
errcode = mouse_get_packet(&packet);
if(errcode == 0)
{
printk_color(GREEN, BLACK, " (Mouse: byte0:%d, x:%3d, y:%3d)\n", packet.byte0, packet.movement_x, packet.movement_y);
//printk_color(GREEN, BLACK, " (Mouse: byte0:%d, x:%3d, y:%3d, byte3:%3d)\n", packet.byte0, packet.movement_x, packet.movement_y, (unsigned char)packet.byte3);
}
}
*/
while (1) while (1)
{ {
keyboard_analyze_keycode(); analyze_mousecode();
struct mouse_packet_3bytes packet = {0};
//struct mouse_packet_4bytes packet = {0};
int errcode = 0;
errcode = mouse_get_packet(&packet);
if(errcode == 0)
{
printk_color(GREEN, BLACK, " (Mouse: byte0:%d, x:%3d, y:%3d)\n", packet.byte0, packet.movement_x, packet.movement_y);
//printk_color(GREEN, BLACK, " (Mouse: byte0:%d, x:%3d, y:%3d, byte3:%3d)\n", packet.byte0, packet.movement_x, packet.movement_y, (unsigned char)packet.byte3);
}
} }
*/
while(1); while (1)
;
} }
void ignore_int() void ignore_int()