static inline kgi_u8_t virge_chipset_dac_in8(virge_chipset_io_t *virge_io, kgi_u_t reg) { /* KRN_ASSERT(reg < VIRGE_MAX_DAC_REGISTERS); */ if (VIRGE_VGA_DAC) { register kgi_u8_t val; /* VIRGE_SET_DAC_ADDR23; ** ** val = mem_in8(VIRGE_VGA_BASE + virge_vga_dac_register[reg & 3]); */ val = io_in8(VIRGE_VGA_IO_BASE + virge_vga_dac_register[reg & 3]); KRN_DEBUG(3, "DAC_IO %.2x -> %.2x", reg, val); return val; } else { register kgi_u8_t val = 0xff; /* val = mem_in8(VIRGE_VGA_MMIO_BASE + VIRGE_DAC_BASE + (reg << 3)); */ KRN_DEBUG(3, "DAC_MEM %.2x -> %.2x", reg, val); return val; } }
void init_pit(void) { int i; char cw = 0; struct CLOCK *c; clock_ctl = (struct CLOCK_CTL*)memman_alloc(memman, sizeof(struct CLOCK_CTL)); io_out8(PIT_CTRL, 0x34); /*IRQ0 CLOCK interrupt AL = 0x34:OUT(0x43, AL); AL = low ;OUT(0x40, AL); AL = high;OUT(0x40, AL); CLK = CRY_FREQ/AX */ io_out8(PIT_CNT0, 0x9c); io_out8(PIT_CNT0, 0x2e); clock_ctl->count = 0; for (i = 0; i < MAX_CLOCK; i++) { clock_ctl->clock_list[i].flag_usage = CLOCK_FLAGS_FREE; } c = clock_alloc(); c->time_out = 0xffffffff; c->flag_usage = CLOCK_FLAGS_USING; c->next = 0; clock_ctl->c0 = c; clock_ctl->next = 0xffffffff; cw = io_in8(PIC0_IMR); cw = cw & 0xfe; io_out8(PIC0_IMR, cw); return; }
void init_pic(void) { /* IRR:インタラプトリクエストレジスタ .IRQピンの状態を表す。ポートを読んだときに、IRRになるかISRになるかは、OCW3で選択する。 .1になっているビットは、現在要求が来ている(もしくは処理中の)割り込み。 ISR:インサービスレジスタ .現在処理中の割り込みがどれであるかを示す。ポートを読んだときに、IRRになるかISRになるかは、OCW3で選択する。 .1になっているビットは、現在処理中の割り込み。処理中というのは、CPUに対してINT命令を発行したが、EOI(割り込み終了命令)を受け取っていない割り込み。 IMR:インタラプトマスクレジスタ .これが1になっている割り込みは、IRRが1になっていても、反応しない。 */ io_out8(PIC0_IMR, 0xff); /*割り込み全部無視(マスタ)*/ io_out8(PIC1_IMR, 0xff); /*割り込み全部無視(スレーブ)*/ io_out8(PIC0_ICW1, 0x11); /*エッジトリガモードに設定(マスタ)*/ io_out8(PIC0_ICW2, 0x20); /*割り込み番号を、20~27に設定。(マスタ)*/ io_out8(PIC0_ICW3, 1 << 2); /*00000100 つまり、スレーブはIRQ2につながってますよということ。*/ io_out8(PIC0_ICW4, 0x01); /*ノンバッファモード(マスタ)*/ io_out8(PIC1_ICW1, 0x11); /*エッジトリガモードに設定(スレーブ)*/ io_out8(PIC1_ICW2, 0x28); /*割り込み番号を、28~2fに設定。(スレーブ)*/ io_out8(PIC1_ICW3, 2); /*自分はマスタのIRQ2番につながってますということ。*/ io_out8(PIC1_ICW4, 0x01); /*ノンバッファモード(スレーブ)*/ io_out8(PIC0_IMR, 0xfb); /*11111011つまり、IRQ2番(スレーブ)だけ許可。あとは無視。(マスタ)*/ io_out8(PIC1_IMR, 0xff); /*11111111つまり、全て無視*/ set_gatedesc(system.io.interrupt.idt+0x27, (int)asm_inthandler27, 2 * 8, AR_INTGATE32); io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0x7f); /*IRQ-07対策*/ return; }
void inthandler21(int *esp) // PS/2キーボードからの割り込み { // struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; unsigned char data; io_out8(PIC0_OCW2, 0x61); //IRQ-01受付完了をPICに通知 data = io_in8(PORT_KEYDAT);//キーボード割込みデータの受け取り fifo8_put(&keyfifo, data);//割り込みデータをFIFOへ格納 //&変数=変数のアドレスを意味するらしい /* if (keybuf.len < 32) { keybuf.data[keybuf.next_w] = data; keybuf.len++; keybuf.next_w++; if (keybuf.next_w == 32) { keybuf.next_w = 0; } } // if (keybuf.flag == 0) { // keybuf.data = data; // keybuf.flag = 1; // } // sprintf(s, "%02X", data); // boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); // putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s);*/ return; }
void int_handler_2c(int *esp){ unsigned char data; io_out8(PIC1_OCW2, 0x64); io_out8(PIC0_OCW2, 0x62); data = io_in8(PORT_KEYDAT); fifo8_put(&mousefifo, data); }
static void x86_i8042_second_handler() { x86_i8042_read_wait(); int scancode = io_in8(&__i8042_ioaddr, DATA_PORT); if (channel2_handler) channel2_handler(scancode); }
void inthandler21(int *esp) { unsigned char data; data = io_in8(PORT_KEYDATA); //键盘输入的信息从0x0060传入一个字节,由data接收到(键盘电路设计一次只能传入一个字节) io_out8(PIC0_OCW2,0x61); //CPU通知PIC0“IRQ1已经受理完毕” fifo_put(&keyFIFO, data); }
void inthandler21(int *esp) { int data; io_out8(PIC0_OCW2, 0x61); /* 把IRQ-01接收信号结束的信息通知给PIC */ data = io_in8(PORT_KEYDAT); fifo32_put(keyfifo, data + keydata0); return; }
/* 等待键盘控制电路准备完毕 */ void wait_KBC_sendready(void) { for (;;) { if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) { return; } } }
/* 处理来自键盘的中断 由naskfunc.nas中的_asm_inthandler21调用 */ void inthandler21(int *esp) { int data; io_out8(PIC0_OCW2, 0x61); /* 通知PIC,IRQ1已经受理完毕 */ data = io_in8(PORT_KEYDAT); /* 从8042的输出缓冲区中读出数据, 若不读出, 则8042不再接收数据 */ fifo32_put(keyfifo, data + keydata0); /* 将接收到的数据存入键盘缓冲区队列中 */ return; }
void inthandler21(int *esp) { int data; io_out8(PIC0_OCW2, 0x61); /* Notify that interrupt received, IRQ number +0x60 */ data = io_in8(PORT_KEYDAT); fifo32_put(fifo_keyboard, data + keyboard_data0); return; }
/** * @description 鼠标中断服务函数 */ void inthandler2c(int *esp){ int data; io_out8(PIC1_OCW2, 0x64); //清空PIC1 IRQ-12中断标志 io_out8(PIC0_OCW2, 0x62); //清空PIC0 IRQ-02中断标志 data = io_in8(PORT_KEYDAT); fifo32_put(mousefifo, data + mousedata0); return; }
void inthandler21(int *esp) { int data; io_out8(PIC0_OCW2, 0x61); /* 通知PIC"IRQ-01已经处理完毕" */ data = io_in8(PORT_KEYDAT); fifo32_put(keyfifo, data + keydata0); /* 将按键发送到队列 */ return; }
/*---------------------------------------------------------------------*/ u32 write_ata_data( u8 *src, u32 nr_write_sector, struct ata_address *addr ) { u8 status; u32 i; /* busy check */ // status = io_in8( 0x01F7 ); // if( status & 0xc8 ) return EBUSY; ndelay( 400 ); // master select must wait 400ns io_out8( 0x1F6, 0x00 ); /* busy check */ // status = io_in8( 0x01F7 ); // if( status & 0xc8 ) return EBUSY2; // u32 nr_sector = size / 512; /* 512 is sector size */ u32 write_size = (nr_write_sector << 9); /* nr_write_sector * 512 */ __ATA_PUTN( write_size, 30,20, 10 ); /* parameter set */ io_out8( 0x01F2, nr_write_sector ); io_out8( 0x01F3, addr->sector ); io_out8( 0x01F4, (u8)(addr->cylinder & 0x00FF) ); io_out8( 0x01F5, (u8)((addr->cylinder & 0xFF00) >> 8) ); io_out8( 0x01F6, 0x00 | addr->header ); /* command */ io_out8( 0x01F7, ATA_CMD_WRITE_PIO ); /* write sector */ for( i = 0; i < write_size; ++i ) { /* status check */ do { status = io_in8( 0x01F7 ); if( status & 0x01 ) return EWRITE; } while( (status & 0x88) == 0x88 ); /* write data */ io_out8( 0x01F0, src[i] ); } status = io_in8( 0x01F7 ); if( status & 0x80 ) return EBUSY3; return ENONE; }
void inthandler21(int *esp) { unsigned char data; io_out8(PIC0_OCW2, 0x61); /* IRQ-01受付完了をPICに通知 */ data = io_in8(PORT_KEYDAT); fifo8_put(&keyfifo, data); return; }
/*---------------------------------------------------------------------*/ u32 read_ata_data( u8 *dst, u32 nr_read_sector, struct ata_address *addr ) { u8 status; u32 i; /* busy check */ // status = io_in8( 0x01F7 ); // if( status & 0xc8 ) return EBUSY; ndelay( 400 ); // master select must wait 400ns io_out8( 0x1F6, 0x00 ); /* busy check */ // status = io_in8( 0x01F7 ); // if( status & 0xc8 ) return EBUSY2; // read_size = nr_read_sector * 512; /* 512 is sector size */ u32 read_size = (nr_read_sector << 9); /* nr_read_sector * 512 */ __ATA_PUTN( read_size, 30, 21, 10 ); /* parameter set */ io_out8( 0x01F2, nr_read_sector ); io_out8( 0x01F3, addr->sector ); io_out8( 0x01F4, (u8)(addr->cylinder & 0x00FF) ); io_out8( 0x01F5, (u8)((addr->cylinder & 0xFF00) >> 8) ); io_out8( 0x01F6, 0x00 | addr->header ); /* command */ io_out8( 0x01F7, ATA_CMD_READ_PIO ); /* read sector */ for( i = 0; i < read_size; ++i ) { /* status check */ do { status = io_in8( 0x01F7 ); if( status & 0x01 ) return EREAD; } while( (status & 0x88) == 0x88 ); /* read data */ dst[i] = io_in8( 0x01F0 ); } status = io_in8( 0x01F7 ); if( status & 0x80 ) return EBUSY3; return ENONE; }
void inthandler2c(int *esp) { unsigned char data; data = io_in8(PORT_KEYDATA); //读取数据方式与键盘一样,所以只能到主程序中通过各自的缓冲区判断是鼠标的数据还是键盘的数据 io_out8(PIC1_OCW2,0x64); //必须先通知从PIC的IRQ12已经处理完毕,然后再通知主PIC(从PIC控制IRQ8到15,IRQ12是第4个,所以是0x64) io_out8(PIC0_OCW2,0x62); //因为主从PIC的协调不能靠自己完成,必须由主程序教给他们怎么做 fifo_put(&mouseFIFO, data); }
///////////////////////////////////////////////////////////////////////////////////// //功能:PS/2的键盘中断,一会在汇编中调用这个函数实现真正的中断:_asm_inthandler21 void inthandler21(int *esp) { int data; io_out8(PIC0_OCW2, 0x61); /* IRQ-01庴晅姰椆傪PIC偵捠抦 */ data = io_in8(PORT_KEYDAT); fifo32_put(keyfifo, keydata0+data); return; }
void sysclock_task(void){ int i, j; unsigned char t[7]; char err, cnt; unsigned char *s; static unsigned char adr[7] = { 0x00, 0x02, 0x04, 0x07, 0x08, 0x09, 0x32 }; static unsigned char max[7] = { 0x60, 0x59, 0x23, 0x31, 0x12, 0x99, 0x99 }; struct CLOCK *clock_rtc; int *buf_rtc; struct FIFO32 fifo_rtc; struct BOOTINFO *binfo = (struct BOOTINFO*) ADR_BOOTINFO; buf_rtc = (int *) memman_alloc(memman, 40); s = (unsigned char *) memman_alloc(memman, 6); fifo32_init(&fifo_rtc, 10, buf_rtc); clock_rtc = clock_alloc(); clock_init(clock_rtc, &fifo_rtc, 1); clock_set_time(clock_rtc, 100); for (;;) { if (fifo32_status(&fifo_rtc) != 0){ i = fifo32_get(&fifo_rtc); if (i == 1) { for (cnt = 0; cnt < 3; cnt++) { err = 0; for (j = 0; j < 7; j++) { io_out8(0x70, adr[j]); t[j] = io_in8(0x71); } for (j = 0; j < 7; j++) { io_out8(0x70, adr[j]); if (t[j] != io_in8(0x71) || (t[j] & 0x0f) > 9 || t[j] > max[j]) { err = 1; } } if (err == 0) { break; } } sprintf(s, "%02X:%02X\0", t[2], t[1]); boxfill8(binfo->vram, binfo->scrnx, COL8_000000, 100, 100, 164, 116); putfonts8_asc(binfo->vram, binfo->scrnx, 100, 100, COL8_848400, s); clock_set_time(clock_rtc, 100); } } } }
void wait_kbc_sendready(void) { for(;;){ if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) break; } return; }
void inthandler21(int *esp) { int data; io_out8(PIC0_OCW2, 0x61); /* IRQ-01受付完了をPICに通知 */ data = io_in8(PORT_KEYDAT); fifo32_put(keyfifo, data + keydata0); return; }
void wait_KBC_sendready(void) { /*等待键盘控制电路准备完毕*/ for(;;){ if((io_in8(PORT_KEYSTA)&KEYSTA_SEND_NOTREADY)==0) break; return ; } }
/* PS/2鼠标的中断 */ void inthandler2c(int *esp) { unsigned char data; io_out8(PIC1_OCW2, 0x64); /* 通知PIC IRQ-12已经受理完毕 */ io_out8(PIC0_OCW2, 0x62); /* 通知PIC IRQ-02已经受理完毕 */ data = io_in8(PORT_KEYDAT); fifo8_put(&mousefifo, data); return; }
static void wait_kbc_sendready(void) { /* wait keybufyboard code send ready */ for ( ; ; ) { if (0 == (io_in8(PORT_KEYSTATE) & KEYSTATE_SEND_NOTREADY)) break; } }
void inthandler21(int *esp) /* interrupt from PS/2 keyboard */ { int data; io_out8(PIC0_OCW2, 0x61); // inform PIC that IRQ-01 has been handled data = io_in8(PORT_KEYDAT); fifo32_put(keyfifo, data + keydata0); return; }
/* PS/2鼠标的中断 */ void inthandler2c(int *esp) { int data; io_out8(PIC1_OCW2, 0x64); /* 通知PIC IRQ-12已经受理完毕 */ io_out8(PIC0_OCW2, 0x62); /* 通知PIC IRQ-02已经受理完毕 */ data = io_in8(PORT_KEYDAT); fifo32_put(mousefifo, data + mousedata0); return; }
/* 处理来自PS/2鼠标的中断 由naskfunc.nas中的_asm_inthandler2c调用 */ void inthandler2c(int *esp) { unsigned char data; io_out8(PIC1_OCW2, 0x64); /* 通知PIC1 IRQ12已经受理完毕 */ io_out8(PIC0_OCW2, 0x62); /* 通知PIC0 IRQ2已经受理完毕 */ data = io_in8(PORT_KEYDAT); /* 从8042的输出缓冲区中读出数据, 若不读出, 则8042不再接收数据 */ fifo32_put(&mousefifo, data);/* 将接收到的数据存入鼠标缓冲区队列中 */ return; }
void wait_KBC_sendready(void) { /* キーボードコントローラがデータ送信可能になるのを待つ */ for (;;) { if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) break; } return; }
void inthandler21(int *esp) { unsigned char data; io_out8(PIC0_OCW2, 0x61); // 通知 PIC "IRQ-01已经受理完毕" data = io_in8(PORT_KEYDAT); fifo8_put(&keyfifo, data); return; }
void wait_KBC_sendready(void) { for (;;){ if (0==(io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY)){ break; } } return; }