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 + -
显示快捷键?