这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » VxWorks硬盘启动问题

共5条 1/1 1 跳转至

VxWorks硬盘启动问题

菜鸟
2007-05-24 22:31:47     打赏

因为需要,我现在想要用secondary master上启动VxWorks,

bootline这样写:

"ata=1,0(0,0) host:/ata0/vxworks h=10.0.0.1 e=10.0.0.2 u=target"

启动后,发现调用ataload函数失败,不能初始化硬盘,添加打印信息发现,

在调用ataDrv时,不能接收到硬盘中断,导致不能获得相应的信号量,引起错误。

怎样才能初始化secondary master上的硬盘呢?请高手指点。




关键词: VxWorks     硬盘     启动     问题    

菜鸟
2007-05-24 23:52:00     打赏
2楼

我的问题不是在VxWork image执行的时候,是在boot image执行的时候,当我引导行像上面的方式写的话,ataDrv函数返回错误,根本无法初始化硬盘,连"Attaching to ATA disk device..."这句话都不会出来,也就是还没有执行到usrAtaConfig这个函数。

在bootConfig.c中,会初始化硬盘,调用ataLoad函数,主要代码如下:

if (ataDrv (ctrl, pAtaResource->drives, pAtaResource->intVector,
pAtaResource->intLevel, pAtaResource->configType,
pAtaResource->semTimeout, pAtaResource->wdgTimeout) == ERROR) //现在我的问题就出在这个地方
{ //这会返回错误
printErr ("Could not initialize.\n");
return (ERROR);
}

printf ("Attaching to ATA disk device... ");

dosFsInit (NUM_DOSFS_FILES); /* initialize DOS-FS */

if (usrAtaConfig (ctrl, drive, fileName) == ERROR)
{
printErr ("usrAtaConfig failed.\n");
return (ERROR);
}


菜鸟
2007-05-25 01:20:00     打赏
3楼

中断挂接都成功了,也使能了可编程中断控制器,在pc.h中定义ATA1的中断号是9,

在bios中也看不到具体是哪个中断号,只是在计算机启动的那个界面上能看到ide控制器的中断号是14,

与ata0的中断号一样,我把ata1的中断号也改成14也不行。

(void) intConnect ((VOIDFUNCPTR *)INUM_TO_IVEC (vector),
(VOIDFUNCPTR)ataIntr, ctrl); //中断服务程序ataintr中会释放信号量
sysIntEnablePIC (level);

调试开关我已经打开了,下面是ataDrv.c中的一段代码,

for (drive = 0; drive < drives; drive++)
{
pType = &ataTypes[ctrl][drive];
pDrive = &pCtrl->drive[drive];
pParam = &pDrive->param;
if (pType->cylinders == 0)
break;

if ((pCtrl->ctrlType == ATA_PCMCIA) ||
((pCtrl->ctrlType != ATA_PCMCIA) && (drive == 0)))
{
if (ataCmd (ctrl, drive, ATA_CMD_DIAGNOSE, NULL, NULL) != OK) //程序在这个地方出错,
{ //原因是得不到信号量
semGive (&pCtrl->muteSem); //输出的中断次数为0
return (ERROR);
}
}

/* find out geometry */

if ((configType & ATA_GEO_MASK) == ATA_GEO_FORCE)
{
(void) ataCmd (ctrl, drive, ATA_CMD_INITP, NULL, NULL);
(void) ataPread (ctrl, drive, (char *)pParam);
}
else if ((configType & ATA_GEO_MASK) == ATA_GEO_PHYSICAL)
{
(void) ataPread (ctrl, drive, (char *)pParam);
pType->cylinders = pParam->cylinders - 1;
pType->heads = pParam->heads;
pType->sectors = pParam->sectors;
}
else if ((configType & ATA_GEO_MASK) == ATA_GEO_CURRENT)
{
(void) ataPread (ctrl, drive, (char *)pParam);
if ((pParam->currentCylinders != 0) &&
(pParam->currentHeads != 0) &&
(pParam->currentSectors != 0))
{
pType->cylinders = pParam->currentCylinders - 1;
pType->heads = pParam->currentHeads;
pType->sectors = pParam->currentSectors;
}
else
{
pType->cylinders = pParam->cylinders - 1;
pType->heads = pParam->heads;
pType->sectors = pParam->sectors;
}
}

ataCmd()函数如下

LOCAL STATUS ataCmd()

{

...

while (retry)
{
ataWait (ctrl, ATA_STAT_READY);

switch (cmd)
{
case ATA_CMD_DIAGNOSE:
ATA_IO_BYTE_WRITE (pCtrl->sdh, ATA_SDH_IBM | (drive << 4));
break;

...

ATA_IO_BYTE_WRITE (pCtrl->command, cmd);
semStatus = semTake (&pCtrl->syncSem, //因为收不到硬盘中断,所以一直得不到信号量
sysClkRateGet() * pCtrl->semTimeout); //导致函数返回错误

if ((pCtrl->intStatus & ATA_STAT_ERR) || (semStatus == ERROR))
{
#ifdef ATA_DEBUG
int error = ATA_IO_BYTE_READ(pCtrl->error);
printErr ("ataCmd err: status=0x%x semStatus=%d err=0x%x\n",
pCtrl->intStatus, semStatus, error);
...


菜鸟
2007-05-26 07:16:00     打赏
4楼

在什么地方改硬盘参数啊?


菜鸟
2007-05-29 04:18:00     打赏
5楼

还是没有搞定,硬盘的柱头数,扇区数等参数在这个阶段还没有用到,就是与硬盘的中断与I/O端口地址有关。


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]