Under the hood

互联网上新生活
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

VMCEPC BSP的一些更新说明

Posted on 2008-10-16 11:13  sting feng  阅读(490)  评论(0编辑  收藏  举报
有人嘲笑说我又把博客写成了年记。真是惭愧,离上一次更新已经大半年过去了,2007年可能是我有史以来最忙碌的一年,项目的压力和生活的琐事让我根本没有心思来关心博客。现在总算可以说松了一口气,我想,我的博客也该更新了。

有不少朋友写信给我询问VMWare BSP的一些问题,这里做一些回答:
1,我提供的BSP是根据哪个BSP改的?
是根据CEPC改的。要不然怎么叫VMCEPC。

2,MS-DOS.vmdk这些文件怎么做?
我想,玩过VMWare的都应该知道怎么做-我以为是常识。

3,网卡驱动。
我 很奇怪为什么很多人写信跟我要网卡驱动。BSP已经提供了所有的东西。不过默认状态下如果你用我提供的BSP来build kernel,会惊讶的发现网卡不能工作,呵呵。这是因为kernel里集成的网卡driver是用 'VMCEPC"src"drivers"netcard"pcnet'目录下的源代码build出来的,而实际能工作的driver其实是 'VMCEPC"FILES'下的二进制版本pcntn4m.dll。在很早很早以前,我本来是想根据这份源代码改出一个能在VMWare下用的版本,后 来因为各种原因,没做-_-!,结果就有了这么个问题。改正过来很简单,编辑platform.bib文件,找出这一行:
    pcntn4m.dll  $(_FLATRELEASEDIR)"pcntn4m.dll            NK SH
改为:
    pcntn4m.dll  $(_TARGETPLATROOT)"files"pcntn4m.dll            NK SH
就搞定了。

4,提供的下载链接失效了。
这倒是个麻烦问题。googlepages似乎是被GFW封掉了,我也暂时没想好还有哪儿可以放。

5,CD- ROM支持。这其实是我一直以来想支持但没能支持的一个功能。现在问题终于搞清楚了,是VMWare的CD-ROM模拟和Windows CE的CD-ROM driver之间有一些兼容性问题。具体的说,问题出在对audio command的支持上。要改正这个问题也不难,只要在$(WINCEROOT)"PUBLIC"COMMON"OAK"DRIVERS"BLOCK "ATAPI"atapipcicd.cpp中把audio command相关的IOCTL code注释掉就可以了:
DWORD
CPCIDiskAndCD::MainIoctl(
    PIOREQ pIOReq
    )
{
    DWORD dwError;

    DEBUGMSG(ZONE_IOCTL, (_T(
        
"Atapi!CPCIDiskAndCD::MainIoctl> IOCTL(0x%x), device(%d) "
        ),pIOReq
->dwCode, m_dwDeviceId));

    dwError 
= CPCIDisk::MainIoctl(pIOReq);

    
if (dwError == ERROR_NOT_SUPPORTED) {

        
switch(pIOReq->dwCode) {

            
// supported ATAPI commands
            case IOCTL_CDROM_READ_SG:
            
case IOCTL_CDROM_TEST_UNIT_READY:
            
case IOCTL_CDROM_DISC_INFO:
            
case IOCTL_CDROM_EJECT_MEDIA:
            
case IOCTL_CDROM_LOAD_MEDIA:

            
// supported DVD commands
            case IOCTL_DVD_START_SESSION:
            
case IOCTL_DVD_READ_KEY:
            
case IOCTL_DVD_END_SESSION:
            
case IOCTL_DVD_SEND_KEY:
            
case IOCTL_DVD_GET_REGION:

#if 0
            
// supported audio commands
            case IOCTL_CDROM_READ_TOC:
            
case IOCTL_CDROM_GET_CONTROL:
            
case IOCTL_CDROM_PLAY_AUDIO_MSF:
            
case IOCTL_CDROM_SEEK_AUDIO_MSF:
            
case IOCTL_CDROM_STOP_AUDIO:
            
case IOCTL_CDROM_PAUSE_AUDIO:
            
case IOCTL_CDROM_RESUME_AUDIO:
            
case IOCTL_CDROM_GET_VOLUME:
            
case IOCTL_CDROM_SET_VOLUME:
            
case IOCTL_CDROM_READ_Q_CHANNEL:
            
case IOCTL_CDROM_GET_LAST_SESSION:
            
case IOCTL_CDROM_RAW_READ:
            
case IOCTL_CDROM_DISK_TYPE:
            
case IOCTL_CDROM_SCAN_AUDIO:
            
case IOCTL_CDROM_ISSUE_INQUIRY:
#endif

                
if (IsAtapiDevice()) {
                    dwError 
= AtapiIoctl(pIOReq);
                }

                
else {
                    dwError 
= ERROR_INVALID_OPERATION;
                }

                
break;

            
default:
                dwError 
= ERROR_NOT_SUPPORTED;
                
break;
        }

    }


    
return dwError;
}
当然我并不是建议你直接改public目录下的代码,只是告诉你应该改哪儿。