Vxworks下的SATA提速
1. ATA接口的三種數據傳輸方式
(1)PIO(Programmable Input-Output)傳輸,可以分為PIO寄存器傳輸和PIO數據傳輸。PIO寄存器傳輸主要用於對ATA設備中的寄存器進行讀寫。讀寫的數據位數為8位DD[7:0]。ATA主機控製器根據所要讀寫的寄存器地址設置CS0_、CS1_、DA[2:0]地址信號,同時將DIOW_或DIOR_設為有效,ATA主機控製器或ATA設備驅動數據總線釋放數據。當DIOW_或DIOR_撤銷時,ATA主機控製器或ATA設備從數據總線上讀取數據。對於PIO數據傳輸,所讀寫的地址為數據端口,讀寫數據為16位。
(2)MDMA(Multiword DMA)傳輸,用於數據傳輸。ATA主機控製器向ATA設備下達MDMA傳輸命令後,等待設備向主機發送DMARQ數據傳輸請求信號。當主機收到DMARQ信號後,向設備發送DMACK_響應信號。MDMA數據傳輸過程與PIO方式大致相同,也是通過DIOW_或DIOR_的周期變化來控製數據的傳輸。在數據傳輸過程中,DMARQ和DMACK_握手信號一直保持有效。
(3)UDMA(Ultra DMA),也是用於數據傳輸。這種傳輸方式的傳輸速度比MDMA要快,ATA/ATAPI-5協議中所定義的UDMA傳輸方式最高數據傳輸速率是66MB/s。UDMA對數據傳輸的控製信號重新進行了定義。另外,UDMA還引入了CRC數據校驗機製,保證了數據傳輸過程的正確性,但其傳輸過程較為複雜。
Transfer mode | Description | Transfer Rate
ATA_PIO_DEF_0 | PIO default mode |
ATA_PIO_DEF_1 | PIO default mode, no IORDY |
ATA_PIO_0 | PIO mode 0 | 3.3 MBps
ATA_PIO_1 | PIO mode 1 | 5.2 MBps
ATA_PIO_2 | PIO mode 2 | 8.3 MBps
ATA_PIO_3 | PIO mode 3 | 11.1 MBps
ATA_PIO_4 | PIO mode 4 | 16.6 MBps
ATA_PIO_AUTO | PIO max supported mode |
ATA_DMA_SINGLE_0 | Single DMA mode 0 | 2.1 MBps
ATA_DMA_SINGLE_1 | Single DMA mode 1 | 4.2 MBps
ATA_DMA_SINGLE_2 | Single DMA mode 2 | 8.3 MBps
ATA_DMA_MULTI_0 | Multi word DMA mode 0 | 4.2 MBps
ATA_DMA_MULTI_1 | Multi word DMA mode 1 | 13.3 MBps
ATA_DMA_MULTI_2 | Multi word DMA mode 2 | 16.6 MBps
ATA_DMA_ULTRA_0 | Ultra DMA mode 0 | 16.6 MBps
ATA_DMA_ULTRA_1 | Ultra DMA mode 1 | 25.0 MBps
ATA_DMA_ULTRA_2 | Ultra DMA mode 2 | 33.3 MBps
ATA_DMA_ULTRA_3 | Ultra DMA mode 3 | 44.4 MBps
ATA_DMA_ULTRA_4 | Ultra DMA mode 4 | 66.6 MBps
ATA_DMA_ULTRA_5 | Ultra DMA mode 5 | 100.0 MBps
ATA_DMA_AUTO | DMA max supported mode |
2. Vxworks下SATA部分的啟動流程
//usrConfig.c
#ifdef INCLUDE_ATA
usrAtaInit ();
if (strcmp (FS_NAMES_ATA_PRIMARY_MASTER, "" ))
usrAtaConfig (0, 0, FS_NAMES_ATA_PRIMARY_MASTER);
if (strcmp (FS_NAMES_ATA_PRIMARY_SLAVE, "" ))
usrAtaConfig (0, 1, FS_NAMES_ATA_PRIMARY_SLAVE);
if (strcmp (FS_NAMES_ATA_SECONDARY_MASTER, "" ))
usrAtaConfig (1, 0, FS_NAMES_ATA_SECONDARY_MASTER);
if (strcmp (FS_NAMES_ATA_SECONDARY_SLAVE, "" ))
usrAtaConfig (1, 1, FS_NAMES_ATA_SECONDARY_SLAVE);
#ifdef INCLUDE_SHOW_ROUTINES
ataShowInit (); /* install ATA/IDE show routine */
#endif /* INCLUDE_SHOW_ROUTINES */
#endif /* INCLUDE_ATA */
//usrAta.c
void usrAtaInit (void)
{
int ix;
ATA_RESOURCE *pAtaResource;
for (ix = 0; ix < ATA_MAX_CTRLS; ix++)
{
pAtaResource = &ataResources[ix];
if (pAtaResource->ctrlType == IDE_LOCAL)
if ((ataDrv (ix, pAtaResource->drives, pAtaResource->intVector,
pAtaResource->intLevel, pAtaResource->configType,
pAtaResource->semTimeout, pAtaResource->wdgTimeout))
== ERROR)
{
printf ("ataDrv returned ERROR from usrRoot.\n");
}
}
}
//ataDrv.c
ataDrv - Initialize the ATA driver ……
INCLUDE_DRV_STORAGE_INTEL_ICH
INCLUDE_ATA
INCLUDE_PIIX4_ATADMA
INCLUDE_ICH7_SUPPORT
最後更新:2017-04-03 05:38:54