有人嘲笑说我又把博客写成了年记。真是惭愧,离上一次更新已经大半年过去了,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注释掉就可以了:
当然我并不是建议你直接改public目录下的代码,只是告诉你应该改哪儿。
有不少朋友写信给我询问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;
}
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;
}