在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2655|回复: 2

求救,help ATAPI驱动

[复制链接]
发表于 2007-12-20 17:34:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
小弟为一DVDROM写ATAPI驱动,检测到硬件无措后,执行TestUnit(0x00)测试命令,发现发出packet命令后,向data寄存器写入12个字节的内容后,中断中检测到错误,错误码是0x20,或0x60,请高手指点,在线等,如需详细信息,我可以把代码发上来,
 楼主| 发表于 2007-12-20 17:43:53 | 显示全部楼层
这是发送packet(0xa0)命令的函数,请各位大虾帮忙,偶得qq是285611790,可加我,多谢了
/******************************************************
*  SendPacketCommand()
*        Output:   0 -> success
*              other -> fail,redo
******************************************************/
unsigned char SendPacketCommand(unsigned char dmamode)
{
unsigned i;
unsigned char status,bug,err_status;
BYTE4 timeout;
timeout = ATAPI_TIME_OUT_VALUE;
/**************************************************
*      wait for device free                         *
**************************************************/
while(1)
{
  status = _ATA_ReadRegister(ATAPI_REG_STATUS);  
   if(!(status & ATAPI_BSY_BIT_MASK)&& !(status & ATAPI_DRQ_BIT_MASK))   
       break;  
  if( --timeout == 0)
  {
      return(1);
    }
  }
/**************************************************
*    initial Atapi task file here                 *
**************************************************/
_ATA_WriteRegister( ATAPI_REG_FEATURE, dmamode &0xff);
_ATA_WriteRegister(ATAPI_REG_BCOUNTL,0x00);
_ATA_WriteRegister(ATAPI_REG_BCOUNTH,0x08);
_ATA_WriteRegister( ATAPI_REG_DRVSEL, 0xa0);
_ATA_WriteRegister( ATAPI_REG_CONTROL, 0x08);
/**************************************************
*    Send packet command opcode 0xa0              *
**************************************************/
RESEND_A0:

_ATA_WriteRegister( ATAPI_REG_COMMAND, ATA_POCKETE_COMMAND);
Wait_nBusy();

/**************************************************
*     Wait for DRQ flag , max 3ms from 0xa0 sent  *
**************************************************/
timeout = ATAPI_TIME_OUT_VALUE;
  while(1)
  {
     status = _ATA_ReadRegister(ATAPI_REG_STATUS);
     if((status & (ATAPI_BSY_BIT_MASK|ATAPI_DRQ_BIT_MASK)) == ATAPI_DRQ_BIT_MASK) //bsy = 0,drq = 1
   break;
   /* if DRQ does not assert 3ms after 0xA0 sent, resend 0xA0 */
     if(--timeout == 0){
         goto RESEND_A0;
     }
  }

/**************************************************
*      Send 12 bytes command data                 *
**************************************************/
for (i = 0; i < 12; i += 2)
{
  _ATA_WriteRegister(ATAPI_REG_DATA, (gAtapi.command[i+1] << 8) | gAtapi.command );
  }
//此处响应中断,检测到错误
Wait_us(200);

  return 0;

}
 楼主| 发表于 2007-12-21 14:12:22 | 显示全部楼层
没有人解答吗,好失望啊,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 00:07 , Processed in 0.031756 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表