harddisk.h
来自「参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发」· C头文件 代码 · 共 170 行
H
170 行
PUBLIC void ideInit(void);
PUBLIC void readSector(int sector, unsigned char *pbuffer);
PUBLIC void writeSector(int sector, unsigned char *pBuffer);PRIVATE void ReadFromPort(unsigned char *pbuffer);PRIVATE void WriteToPort(unsigned char *pBuffer);PRIVATE void GetHDInfo(void);PUBLIC void harddiskHandler(int Irq);PUBLIC void Test(void);PUBLIC void HDTask();
/*********************************************************************/extern int printk(const char * fmt, ...);//BatchRead();//BatchWrite();//sti();
//cli();/*********************************************************************/#define OK 1
#define STATUS_REG 0x1f7 //状态寄存器--->0x1f7
#define ERROR_REG 0x1f1 //ERROR寄存器--->0x1f1
#define WRITE_REG 0x1f1 //写寄存器----->0x1f1
#define SECTOR_NUM_REG 0x1f2 //扇区数寄存器---->0x1f2
#define SECTOR_REG 0x1f3 //扇区寄存器------>0x1f3
#define CYLINDER_REG_LOW 0x1f4 //
#define CYLINDER_REG_HIGH 0x1f5
#define DRIVE_REG 0x1f6
/* command register */
#define COMMAND_REG 0x1f7
/* data register */
#define DATA_REG 0x1f0
/* hd control register */
#define CONTROL_REG 0x3f6
#define SECTOR_SIZE 512#define outb(value,port) __asm__ ("outb %%al,%%dx"::"a" (value),"d" (port))
#define inb(port) ({ unsigned char _v; __asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); _v; })
#define outb_p(value,port) __asm__ ("outb %%al,%%dx\n" "\tjmp 1f\n" "1:\tjmp 1f\n" "1:"::"a" (value),"d" (port))
#define inb_p(port) ({ unsigned char _v; __asm__ volatile ("inb %%dx,%%al\n" "\tjmp 1f\n" "1:\tjmp 1f\n" "1:":"=a" (_v):"d" (port)); _v; })
#define cli() __asm__("cli\n"); //关闭中断
#define sti() __asm__("sti\n"); //开中断#define BatchRead(port,buf,nr) __asm__("cld;rep;insw"::"d" (port),"D" (buf),"c" (nr))
#define BatchWrite(port,buf,nr) __asm__("cld;rep;outsw"::"d" (port),"S" (buf),"c" (nr))/* some useful structure */
typedef struct {
unsigned short config; /* lots of obsolete bit flags */
unsigned short cyls; /* "physical" cyls */
unsigned short reserved2; /* reserved (word 2) */
unsigned short heads; /* "physical" heads */
unsigned short track_bytes; /* unformatted bytes per track */
unsigned short sector_bytes; /* unformatted bytes per sector */
unsigned short sectors; /* "physical" sectors per track */
unsigned short vendor0; /* vendor unique */
unsigned short vendor1; /* vendor unique */
unsigned short vendor2; /* vendor unique */
unsigned char serial_no[20]; /* 0 = not_specified */
unsigned short buf_type;
unsigned short buf_size; /* 512 byte increments; 0 = not_specified */
unsigned short ecc_bytes; /* for r/w long cmds; 0 = not_specified */
unsigned char fw_rev[8]; /* 0 = not_specified */
char model[40]; /* 0 = not_specified */
unsigned char max_multsect; /* 0=not_implemented */
unsigned char vendor3; /* vendor unique */
unsigned short dword_io; /* 0=not_implemented; 1=implemented */
unsigned char vendor4; /* vendor unique */
unsigned char capability; /* bits 0:DMA 1:LBA 2:IORDYsw 3:IORDYsup*/
unsigned short reserved50; /* reserved (word 50) */
unsigned char vendor5; /* vendor unique */
unsigned char tPIO; /* 0=slow, 1=medium, 2=fast */
unsigned char vendor6; /* vendor unique */
unsigned char tDMA; /* 0=slow, 1=medium, 2=fast */
unsigned short field_valid; /* bits 0:cur_ok 1:eide_ok */
unsigned short cur_cyls; /* logical cylinders */
unsigned short cur_heads; /* logical heads */
unsigned short cur_sectors; /* logical sectors per track */
unsigned short cur_capacity0; /* logical total sectors on drive */
unsigned short cur_capacity1; /* (2 words, misaligned int) */
unsigned char multsect; /* current multiple sector count */
unsigned char multsect_valid; /* when (bit0==1) multsect is ok */
unsigned int lba_capacity; /* total number of sectors */
unsigned short dma_1word; /* single-word dma info */
unsigned short dma_mword; /* multiple-word dma info */
unsigned short eide_pio_modes; /* bits 0:mode3 1:mode4 */
unsigned short eide_dma_min; /* min mword dma cycle time (ns) */
unsigned short eide_dma_time; /* recommended mword dma cycle time (ns) */
unsigned short eide_pio; /* min cycle time (ns), no IORDY */
unsigned short eide_pio_iordy; /* min cycle time (ns), with IORDY */
unsigned short word69;
unsigned short word70;
/* HDIO_GET_IDENTITY currently returns only words 0 through 70 */
unsigned short word71;
unsigned short word72;
unsigned short word73;
unsigned short word74;
unsigned short word75;
unsigned short word76;
unsigned short word77;
unsigned short word78;
unsigned short word79;
unsigned short word80;
unsigned short word81;
unsigned short command_sets; /* bits 0:Smart 1:Security 2:Removable 3:PM */
unsigned short word83; /* bits 14:Smart Enabled 13:0 zero */
unsigned short word84;
unsigned short word85;
unsigned short word86;
unsigned short word87;
unsigned short dma_ultra;
unsigned short word89; /* reserved (word 89) */
unsigned short word90; /* reserved (word 90) */
unsigned short word91; /* reserved (word 91) */
unsigned short word92; /* reserved (word 92) */
unsigned short word93; /* reserved (word 93) */
unsigned short word94; /* reserved (word 94) */
unsigned short word95; /* reserved (word 95) */
unsigned short word96; /* reserved (word 96) */
unsigned short word97; /* reserved (word 97) */
unsigned short word98; /* reserved (word 98) */
unsigned short word99; /* reserved (word 99) */
unsigned short word100; /* reserved (word 100) */
unsigned short word101; /* reserved (word 101) */
unsigned short word102; /* reserved (word 102) */
unsigned short word103; /* reserved (word 103) */
unsigned short word104; /* reserved (word 104) */
unsigned short word105; /* reserved (word 105) */
unsigned short word106; /* reserved (word 106) */
unsigned short word107; /* reserved (word 107) */
unsigned short word108; /* reserved (word 108) */
unsigned short word109; /* reserved (word 109) */
unsigned short word110; /* reserved (word 110) */
unsigned short word111; /* reserved (word 111) */
unsigned short word112; /* reserved (word 112) */
unsigned short word113; /* reserved (word 113) */
unsigned short word114; /* reserved (word 114) */
unsigned short word115; /* reserved (word 115) */
unsigned short word116; /* reserved (word 116) */
unsigned short word117; /* reserved (word 117) */
unsigned short word118; /* reserved (word 118) */
unsigned short word119; /* reserved (word 119) */
unsigned short word120; /* reserved (word 120) */
unsigned short word121; /* reserved (word 121) */
unsigned short word122; /* reserved (word 122) */
unsigned short word123; /* reserved (word 123) */
unsigned short word124; /* reserved (word 124) */
unsigned short word125; /* reserved (word 125) */
unsigned short word126; /* reserved (word 126) */
unsigned short word127; /* reserved (word 127) */
unsigned short security; /* bits 0:support 1:enabled 2:locked 3:frozen */
unsigned short reserved[127];
}hd_id;
hd_id id; /* the struct for hd paras */
int reading = 0; /* indicate whether is reading */
/* the buffer for reading a sector , user can copy it to user 's space */
unsigned char ReadBuffer[SECTOR_SIZE];
unsigned char WriteBuffer[SECTOR_SIZE];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?