⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ide.h

📁 newos is new operation system
💻 H
字号:
/* ** Copyright 2002, Thomas Kurschel. All rights reserved.** Distributed under the terms of the NewOS License.*/#ifndef __CONTROLLER_H__#define __CONTROLLER_H__#include <kernel/bus/scsi/lendian_bitfield.h>#include <kernel/vfs.h>typedef union {	struct {		uint8	features;		uint8	sector_count;		uint8	sector_number;		uint8	cylinder_0_7;		uint8	cylinder_8_15;		LBITFIELD8_3(			head				: 4,			device				: 1,			mode				: 3		);		uint8	command;	} chs;	struct {		uint8	features;		uint8	sector_count;		uint8	lba_0_7;		uint8	lba_8_15;		uint8	lba_16_23;		LBITFIELD8_3(			lba_24_27			: 4,			device				: 1,			mode				: 3		);		uint8	command;	} lba;	struct {		LBITFIELD8_3(			dma					: 1,			ovl					: 1,			_0_res2				: 6		);		LBITFIELD8_2(			_1_res0				: 3,			tag					: 5		);		uint8	_2_res;		uint8	byte_count_0_7;		uint8	byte_count_8_15;		LBITFIELD8_5(			_5_res0				: 4,			device				: 1,			_5_obs5				: 1,			_5_res6				: 1,			_5_obs7				: 1		);		uint8	command;	} packet;	struct {		LBITFIELD8_5(			ili					: 1,			eom					: 1,			abrt				: 1,			_0_res3				: 1,			sense				: 4		);		LBITFIELD8_4(			cmd_or_data			: 1,	// 1 - cmd, 0 - data			input_or_output	 	: 1,	// 0 - input (to device), 1 - output			release				: 1,			tag					: 5		);		uint8	_2_res;		uint8	byte_count_0_7;		uint8	byte_count_8_15;		LBITFIELD8_5(			_4_res0				: 4,			device				: 1,			_4_obs5				: 1,			_4_res6				: 1,			_4_obs7				: 1		);		LBITFIELD8_7(			chk					: 1,			_7_res1 				: 2,			drq					: 1,			serv				: 1,			dmrd				: 1,			drdy				: 1,			bsy					: 1		);	} packet_res;	struct {		uint8	sector_count;		LBITFIELD8_4(			cmd_or_data			: 1,	// 1 - cmd, 0 - data			input_or_output		: 1,	// 0 - input (to device), 1 - output			release				: 1,			tag					: 5		);		uint8	lba_0_7;		uint8	lba_8_15;		uint8	lba_16_23;		LBITFIELD8_3(			lba_24_27			: 4,			device				: 1,			mode				: 3		);		uint8	command;	} queued;	struct {		// low order bytes		uint8	features;		uint8	sector_count_0_7;		uint8	lba_0_7;		uint8	lba_8_15;		uint8	lba_16_23;		LBITFIELD8_3(			_5low_res0			: 4,			device				: 1,			mode				: 3		);		uint8	command;				// high order bytes		uint8	_0high_res;		uint8	sector_count_8_15;		uint8	lba_24_31;		uint8	lba_32_39;		uint8	lba_40_47;	} lba48;	struct {		// low order bytes		uint8	sector_count_0_7;		LBITFIELD8_4(			cmd_or_data			: 1,	// 1 - cmd, 0 - data			input_or_output	 	: 1,	// 0 - input (to device), 1 - output			release				: 1,			tag					: 5		);		uint8	lba_0_7;		uint8	lba_8_15;		uint8	lba_16_23;		LBITFIELD8_3(			_5low_res0				: 4,			device					: 1,			mode					: 3		);		uint8	command;				// high order bytes		uint8	sector_count_8_15;		uint8	_1high_res;		uint8	lba_24_31;		uint8	lba_32_39;		uint8	lba_40_47;	} queued48;	struct {		uint8	_0_res[3];		uint8	ver;			// RMSN version		LBITFIELD8_3(			pena	: 1,		// previously enabled			lock	: 1,		// capable of locking			pej		: 1			// can physically eject		);	} set_MSN_res;	struct {		uint8	r[7+5];	} raw;	struct {		uint8	features;		uint8	sector_count;		uint8	sector_number;		uint8	cylinder_low;		uint8	cylinder_high;		uint8	device_head;		uint8	command;	} write;	struct {		uint8	error;		uint8	sector_count;		uint8	sector_number;		uint8	cylinder_low;		uint8	cylinder_high;		uint8	device_head;		uint8	status;	} read;} ide_task_file;// content of "mode" fieldenum {	ide_mode_chs = 5,	ide_mode_lba = 7};// mask for valid ide_task_file fieldstypedef enum {	ide_mask_features	 		= 0x01,	ide_mask_sector_count		= 0x02,	// CHS	ide_mask_sector_number		= 0x04,	ide_mask_cylinder_low		= 0x08,	ide_mask_cylinder_high		= 0x10,		// LBA	ide_mask_LBA_low			= 0x04,	ide_mask_LBA_mid			= 0x08,	ide_mask_LBA_high			= 0x10,	// packet	ide_mask_byte_count			= 0x18,		// packet and dma queued result	ide_mask_error				= 0x01,	ide_mask_ireason			= 0x02,	ide_mask_device_head		= 0x20,	ide_mask_command			= 0x40,		ide_mask_status				= 0x40,	// for 48 bits, the follow flags declare which registers to load twice	ide_mask_features_48		= 0x80 | ide_mask_features,	ide_mask_sector_count_48	= 0x80 | ide_mask_sector_count,	ide_mask_LBA_low_48			= 0x100 | ide_mask_LBA_low,	ide_mask_LBA_mid_48			= 0x200 | ide_mask_LBA_mid,	ide_mask_LBA_high_48		= 0x400 | ide_mask_LBA_high,		ide_mask_HOB				= 0x780	//ide_mask_all			= 0x7f} ide_reg_mask;// status registerenum {	ide_status_err		= 0x01,		// error	ide_status_index	= 0x02,		// obsolete	ide_status_corr		= 0x04,		// obsolete	ide_status_drq		= 0x08,		// data request	ide_status_dsc		= 0x10,		// reserved	ide_status_service	= 0x10,		// ready to service device	ide_status_dwf		= 0x20,		// reserved	ide_status_dma		= 0x20,		// reserved	ide_status_dmrd		= 0x20,		// packet: DMA ready	ide_status_df		= 0x20,		// packet: disk failure	ide_status_drdy		= 0x40,		// device ready	ide_status_bsy		= 0x80		// busy} ide_status_mask;// device control registerenum {									// bit 0 must be zero	ide_devctrl_nien	= 0x02,		// disable INTRQ	ide_devctrl_srst	= 0x04,		// software device reset	ide_devctrl_bit3	= 0x08,		// don't know, but must be set									// bits inbetween are reserved	ide_devctrl_hob		= 0x80		// read high order byte (for 48-bit lba)} ide_devcntrl_mask;// error register - most bits are command specificenum {	// always used	ide_error_abrt		= 0x04,		// command aborted		// used for Ultra DMA modes	ide_error_icrc		= 0x80,		// interface CRC error	// used by reading data transfers	ide_error_unc		= 0x40,		// uncorrectable data error	// used by writing data transfers	ide_error_wp		= 0x40,		// media write protect	// used by all data transfer commands	ide_error_mc		= 0x20,		// medium changed	ide_error_idnf		= 0x10,		// CHS translation not init./ invalid CHS address	ide_error_mcr		= 0x08,		// media change requested	ide_error_nm		= 0x02,		// no media (for removable media devices)} ide_error_mask;typedef struct ide_controller_params {	int dma_alignment;				// this must 2^i-1 for some i	size_t dma_boundary;	bool dma_boundary_solid;	int max_sg_num;	int max_blocks;	int max_devices;	int can_DMA;	int can_CQ;} ide_controller_params;typedef struct ide_channel_info *ide_channel_cookie;	typedef struct {	int (*write_command_block_regs)		(ide_channel_cookie channel, ide_task_file *tf, ide_reg_mask mask);	int (*read_command_block_regs)		(ide_channel_cookie channel, ide_task_file *tf, ide_reg_mask mask);	uint8 (*get_altstatus) (ide_channel_cookie channel);	int (*write_device_control) (ide_channel_cookie channel, uint8 val);		int (*write_pio_16) (ide_channel_cookie channel, uint16 *data, int count, bool force_16bit );	int (*read_pio_16) (ide_channel_cookie channel, uint16 *data, int count, bool force_16bit );	int (*prepare_dma)(ide_channel_cookie channel, const iovec *vec, size_t count,	                        uint32 startbyte, uint32 blocksize,	                        size_t *numBytes, bool write);	int (*start_dma)(ide_channel_cookie channel);	int (*finish_dma)(ide_channel_cookie channel);		// currently, we ignore returned error code	int (*release)( ide_channel_cookie channel );} ide_controller_interface;#define IDE_BUS_MANAGER_NAME "bus_managers/ide/v1"typedef struct ide_bus_info *ide_bus_cookie;typedef struct {	int (*irq_handler)( ide_bus_cookie channel );		// as soon as *bus is written the channel gets used for device 	// detection, so make sure it's really ready	int (*connect_channel)( const char *name, 		ide_controller_interface *controller,		ide_channel_cookie channel,		ide_controller_params *params, ide_bus_cookie *bus );			int (*disconnect_channel)( ide_bus_cookie bus );} ide_bus_manager_interface;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -