📄 atapi.h
字号:
/*
********************************************************
// Copyright (c)2004 Ark Pioneer Microelectronics Ltd.,
// All Rights Reserved
//
// Filename:atapi.h
// Version:1.0
// Created:2004.01.13 By: Philip
********************************************************
*/
#ifndef _ATAPI_H_
#define _ATAPI_H_
#include "config.h"
/***********************************************/
//BLOCK 1 SPACE ALLOCATION
#define PASSWORD_PAGE 0
#define FLASH_INFO_PAGE 1
#define PARTITION_INFO_PAGE 2
#define BACKUP_INDEX_PAGE 3
#define BAD_INDEX_PAGE 4
#define PRODUCT_INFO_PAGE 5
#define INQUIRY_INFO_PAGE 6
// States
#define UNCONFIGURED 0
#define WAIT_FOR_CBW 1
#define WAIT_TO_SEND_CSW 2
#define WAIT_FOR_OUT_DATA 3
#define WAIT_FOR_IN_DATA 4
// Mapping of DA and CS numbers to port pins
// Change bit f to bit t in x
// #define CBIT(in, f, t) ((in & (1<<f))?(1<<t):0)
// #define DA(x) (CBIT(x, 0, 3) | CBIT(x, 1, 5) | CBIT(x, 2, 4))
// #define CS(x) (x << 1)
#define DA(x) ((x & 3) | ((x & 4) << (5-2)))
#define CS(x) (x << 6)
// 2004.09.02, philip add
// We have sent USBS when processing write_10, so we return this.
#define USBS_NO_SEND 0xff
#define USBS_PASSED 0
#define USBS_FAILED 1
#define READ_ONLY 1
#define READ_AND_WRITE 0
// Local defines from the mass storage class spec
#define CBW_TAG 4
#define CBW_DATA_TRANSFER_LEN_LSB 8
#define CBW_DATA_TRANSFER_LEN_MSB 9
#define CBW_FLAGS 12
#define CBW_FLAGS_DIR_BIT 0x80
#define CBW_LUN 13
#define CBW_CBW_LEN 14
#define CBW_COMMAND 15
#define CBW_CBW_LEN_MASK 0x1f
#define CBW_DATA_START 15 // CBW head block length
#define EXTENDED_COMMAND_PARAMETER 17
//++
// 2004.08.31, philip add
// extended command byte offset
#define EXTENDED_FLASH_INDEX_BYTE (0x11) // decimal 17
// extended command parameter -- block index,
// it contains 2 bytes
#define EXTENDED_BLOCK_INDEX_BYTE (0x12) // decimal 18
#define EXTENDED_BLOCK_INDEX_HWORD (0x09)
// extended command parameter -- page index,
// it contains 1 byte
#define EXTENDED_PAGE_INDEX_BYTE (0x14) // decimal 20
#define EXTENDED_PAGE_INDEX_WORD (0x05)
//--
#define USB_MS_RBC_SUBCLASS 1
#define USB_MS_CD_ROM_SUBCLASS 2
#define USB_MS_SCSI_TRANSPARENT_SUBCLASS 6
// Local defines for the mass storage device
#define PROCESS_CBW_TIMEOUT_RELOAD 0x7000
#define MAX_BULK_PACKET_SIZE 0x40
#define PIO_ADDR_COMMAND 7
#define PIO_ADDR_DATA 0
#define ATAPI_STATUS_BUSY_BIT 0x80
#define ATAPI_STATUS_DRDY_BIT 0x40
#define ATAPI_STATUS_DF_BIT 0x20
#define ATAPI_STATUS_DSC_BIT 0x10
#define ATAPI_STATUS_DRQ_BIT 0x08
#define ATAPI_STATUS_CORR_BIT 0x04
#define ATAPI_STATUS_INDEX_BIT 0x02
#define ATAPI_STATUS_ERROR_BIT 0x01
#define ATA_SECTOR_SIZE 0x200
#define IDE_COMMAND_ID_DEVICE 0xec
#define IDE_ID_TOTAL_SECTORS_MSW 60*2
#define IDE_ID_TOTAL_SECTORS_LSW 61*2
#define ATAPI_INQUIRY_SERIAL 10*2
#define ATAPI_INQUIRY_SERIAL_LEN 12
#define ATAPI_COMMAND_ID_DEVICE 0xa1
#define ATAPI_COMMAND_ATAPI_PACKET 0xa0
#define ATAPI_COMMAND_SOFT_RESET 0x08
#define ATAPI_COMMAND_CHECK_POWER 0xe5
#define ATAPI_COMMAND_EXEC_DIAG 0x90
#define ATAPI_COMMAND_IDLE 0xe3
#define ATAPI_COMMAND_IDLE_IMMED 0xe1
#define ATAPI_COMMAND_NOP 0x00
#define ATAPI_COMMAND_SERVICE 0xa2
#define ATAPI_COMMAND_SET_FEATURES 0xef
#define ATAPI_COMMAND_SLEEP 0xe6
#define ATAPI_COMMAND_STANDBY 0xe2
#define ATAPI_COMMAND_STANDBY_IMMED 0xe0
#define ATAPI_PACKET_LOAD_UNLOAD 0xa6
#define ATAPI_CONTROL_REG_SOFT_RESET 4
#define ATAPI_CONTROL_REG_DEFAULT 8
// Converted RBC commands
#define ATA_COMMAND_READ_10 0x20
#define ATA_COMMAND_WRITE_10 0x30
#define ATA_COMMAND_VERIFY_10 0x40
// Still unconverted RBC commands
#define ATA_COMMAND_INQUIRY 0x12
#define ATA_COMMAND_MODE_SELECT_6 0x15
#define ATA_COMMAND_MODE_SENSE_6 0x1A
#define ATA_COMMAND_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E
#define ATA_COMMAND_START_STOP_UNIT 0x1B
#define ATA_COMMAND_TEST_UNIT_READY 0x00
#define ATA_COMMAND_WRITE_BUFFER 0x3B
// Optional RBC commands
#define ATA_COMMAND_NOP 0x00
#define ATA_COMMAND_FORMAT_UNIT 0x04
#define ATA_COMMAND_PERSISTENT_RESERVE_IN 0x5E
#define ATA_COMMAND_PERSISTENT_RESERVE_OUT 0x5F
#define ATA_COMMAND_RELEASE_6 0x17
#define ATA_COMMAND_REQUEST_SENSE 0x03
#define ATA_COMMAND_RESERVE_6 0x16
#define ATA_COMMAND_SYNCHRONIZE_CACHE 0x35
// Fields in the INQUIRY
#define SCSI_INQUIRY_DEVICE_CLASS 0
#define SCSI_INQUIRY_REMOVABLE_BIT 0x80
#define SCSI_INQUIRY_REMOVABLE_BYTE 1
#define ATAPI_INQUIRY_REMOVABLE_BYTE 0
#define SCSI_INQUIRY_DATA_FORMAT 3
#define SCSI_INQUIRY_MANUFACTURER 8
#define ATAPI_INQUIRY_MANUFACTURER 27
#define SCSI_INQUIRY_MANUFACTURER_LEN 24
#define ATAPI_INQUIRY_REVISION 73
#define SCSI_INQUIRY_REVISION 32
#define SCSI_INQUIRY_REVISION_LEN 4
// Local ATAPI defines -- Command register block
#define ATAPI_DATA_REG (DA(0)|CS(2))
#define ATAPI_ERROR_REG (DA(1)|CS(2))
#define ATAPI_FEATURE_REG (DA(1)|CS(2))
#define ATAPI_INT_CAUSE_REG (DA(2)|CS(2))
#define ATAPI_BYTE_COUNT_LSB (DA(4)|CS(2))
#define ATAPI_BYTE_COUNT_MSB (DA(5)|CS(2))
#define ATAPI_DRIVESEL_REG (DA(6)|CS(2))
#define ATAPI_STATUS_REG (DA(7)|CS(2))
#define ATAPI_COMMAND_REG (DA(7)|CS(2))
#define ATAPI_NULL_REG (DA(7)|CS(3))
// Local ATAPI defines -- Control register block
#define ATAPI_ALT_STATUS_REG (DA(6)|CS(1))
#define ATAPI_CONTROL_REG (DA(6)|CS(1))
// IDE registers -- Overlay on the ATAPI register space
#define ATA_DATA_REG (DA(0)|CS(2))
#define ATA_ERROR_REG (DA(1)|CS(2))
#define ATA_SECTOR_COUNT_REG (DA(2)|CS(2))
#define ATA_LBA_LSB_REG (DA(3)|CS(2))
#define ATA_LBA_2SB_REG (DA(4)|CS(2))
#define ATA_LBA_MSB_REG (DA(5)|CS(2))
#define ATA_DRIVESEL_REG (DA(6)|CS(2))
#define ATA_COMMAND_REG (DA(7)|CS(2))
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -