Escolar Documentos
Profissional Documentos
Cultura Documentos
Abstract
This paper provides information about IEEE 1394 support in Windows 7. It provides information for 1394 developers to understand the new 1394 bus driver in Windows 7. The 1394 bus driver was rewritten for Windows 7 to provide support for higher speeds and alternative media, as defined in the IEEE-1394b specification. The 1394 bus driver that is included with Windows 7 replaces the 1394 bus drivers that were included with earlier versions of Windows. This paper provides information about the differences between the new 1394 bus driver implementation and the earlier implementation, as well as information about the new functionality that is included in the 1394 bus driver for Windows 7. This information applies to the Windows 7 operating system. References and resources discussed here are listed at the end of this paper. The current version of this paper is maintained on the Web at: http://www.microsoft.com/whdc/connect/1394_Windows7.mspx
Disclaimer: This is a preliminary document and may be changed substantially prior to final commercial release of the software described herein. The information contained in this document represents the current view of Microsoft Corporation on the issues discussed as of the date of publication. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information presented after the date of publication. This White Paper is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS DOCUMENT. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, email address, logo, person, place or event is intended or should be inferred. 2009 Microsoft Corporation. All rights reserved. Microsoft, MSDN, and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners.
Contents
Introduction ................................................................................................................... 4 New and Legacy 1394 Bus Drivers ................................................................................. 4 Differences in Functional Behavior ................................................................................ 5 All I/O Requests Pended ............................................................................................ 5 Configuration ROM Retrieval ..................................................................................... 5 IEEE-1394-1995 PHY Support ..................................................................................... 6 Referencing NODE_DEVICE_EXTENSION ................................................................... 6 Device Driver Interface (DDI) Changes ...................................................................... 6 Retrieving the Contents of a 1394 Nodes Configuration ROM ..................................... 6 Retrieving the Configuration ROM Header ................................................................ 7 New Configuration ROM ............................................................................................ 7 Previously Retrieved Configuration ROM .................................................................. 8 Gap Count Optimization................................................................................................. 8 Modifying the Default Behavior ..................................................................................... 9 Registry Value Locations ............................................................................................ 9 Registry Values ........................................................................................................... 9 General DDI Changes.................................................................................................... 10 1394 DDI Speed and Payload Definitions ................................................................ 10 1394 DDIs with Speed or Payload Changes ............................................................. 11 REQUEST_ASYNC_READ ...................................................................................... 11 REQUEST_ASYNC_WRITE..................................................................................... 11 REQUEST_ISOCH_ALLOCATE_BANDWIDTH ........................................................ 11 REQUEST_ISOCH_ALLOCATE_RESOURCES .......................................................... 12 REQUEST_ISOCH_FREE_BANDWIDTH ................................................................. 12 REQUEST_SET_DEVICE_XMIT_PROPERTIES ........................................................ 12 REQUEST_ASYNC_STREAM.................................................................................. 12 REQUEST_ISOCH_MODIFY_STREAM_PROPERTIES ............................................. 12 REQUEST_GET_SPEED_BETWEEN_DEVICES ........................................................ 13 Determining New or Legacy DDI Support .................................................................... 13 Extended Bus Reset Notification DDIs ......................................................................... 13 PHY Packet Support DDIs ............................................................................................. 14 REQUEST_SEND_PHY_PACKET................................................................................. 14 REQUEST_RECEIVE_PHY_PACKETS .......................................................................... 15 Retrieve Configuration ROM DDI ................................................................................. 16 Resources ..................................................................................................................... 18
Introduction
The 1394 bus driver was rewritten for Windows 7 to add support for higher speeds and alternative media as defined in the IEEE-1394b specification. This paper refers to the Windows 7 version of the 1394 bus driver as the new 1394 bus driver and the earlier version of the 1394 bus driver as the legacy 1394 bus driver. This paper provides the following information about the new 1394 bus driver: Design and implementation differences between the new 1394 bus driver and the legacy 1394 bus driver. Behavior of the new 1394 bus driver. Changes to the device driver interfaces (DDIs) for the new 1394 bus driver.
This paper assumes that you are familiar with 1394 technology and its corresponding implementation for Windows. It also assumes that you are familiar with the basic terminology that is related to Windows kernel-mode device drivers as well as basic knowledge of the 1394 DDIs and their corresponding I/O request blocks (IRBs). For more information about 1394 and Windows kernel-mode device drivers, see Resources at the end of this paper.
1394BUS.SYS
1394OHCI.SYS
OHCI1394.SYS
Figure 2 shows the 1394 stack with the new 1394 bus driver and the Microsoftsupported 1394 client drivers.
MSTAPE.SYS MSDV.SYS Additional AVC Subunits (Audio?)
AVC.SYS
Debug Tools
Disk Subsystem
61883.SYS
1394DBG.SYS
SBP2PORT.SYS
SONYDCAM.SYS
1394OHCI.SYS*
For more information about the logic that the new 1394 bus driver uses to retrieve the contents of a node's configuration ROM, see Retrieving the Contents of a 1394 Nodes Configuration ROM later in this paper.
Referencing NODE_DEVICE_EXTENSION
Some client device drivers reference the device extension in the 1394 bus driver that is associated with the physical device object (PDO) for the device. This device extension is described by the NODE_DEVICE_EXTENSION structure. In the new 1394 bus driver, this structure remains at the same location as in the legacy 1394 bus driver, but the nonstatic members of the structure might not be valid. When client device drivers use the new 1394 bus driver, they must ensure that the data that they access in this structure is valid. The static members of the NODE_DEVICE_EXTENSION structure that contain valid data are Tag, DeviceObject, and PortDeviceObject. All other members of the NODE_DEVICE_EXTENSION structure are not static. Client device drivers must not reference these members.
The new 1394 bus driver retrieves the contents of a nodes configuration ROM after a 1394 bus reset by sending asynchronous read transactions to the node. The new 1394 bus driver tries to minimize the number of asynchronous read transactions that are sent to a node to retrieve the contents of the node's configuration ROM.
The following location in the registry contains the individual 1394 controller registry values:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class \{6BDD1FC1-810F-11D0-BEC7-08002BE2092F}\<NNNN>
<NNNN> represents the instance identification number for each individual 1394 controller.
Registry Values
Table 1 describes the registry values that the new 1394 bus driver supports. You can specify all registry values either globally or for a particular 1394 controller. Any registry values that are specified for a particular 1394 controller override any corresponding globally specified registry values.
Table 1. 1394 Registry Values Name Type Value DisableGenerationCountCompare DWORD 0 or 1 Default Description 0 The new 1394 bus driver compares the generation count value in the self_id register of the 1394 controller with the generation count value that is received in the asynchronous receive DMA request context buffer when it processes received asynchronous requests. Setting this value to 0 enables generation count comparison. Setting this value to 1 disables generation count comparison. 0 Setting this value to 0 enables the default method for retrieving the contents of the configuration ROM. Setting this value to 1 causes the new 1394 bus driver to use asynchronous quadlet read transactions to retrieve the contents of the configuration ROM.
UseQuadletReadsForEnumeration DWORD 0 or 1
Name EnumerateIP1394
EnableGapCountOptimization
Default Description 0 Setting this value to 0 disables enumeration of IP1394 devices on the 1394 bus. Setting this value to 1 enables enumeration of IP1394 devices on the 1394 bus. DWORD 0 or 1 Optimize Setting this value to 0 disables gap for count optimization. Setting this value 1394a to 1 enables gap count optimization. topology Note: Enabling gap count optimization only optimizes the gap count for all 1394 bus topologies, including 1394b. The gap count value that is used is based on the table method, as specified in the IEEE-1394a specification. End users must ensure that the gap count that is used is valid for their 1394 bus topology. Setting this value to 0 disables cycle start packets if no isochronous-capable nodes are found on the 1394 bus. Setting this value to 1 enables cycle start packets regardless of whether isochronous-capable nodes are found on the 1394 bus. Note: The new 1394 bus driver disables and enables cycle start packets only if the local node is the bus manager.
EnablePersistentCycleStarts
DWORD 0 or 1
Table 3 describes the speed flags for each of the newly supported speeds.
Table 3. Speed Flags Name SPEED_FLAGS_800 SPEED_FLAGS_1600 SPEED_FLAGS_3200 Value 0x08 0x10 0x20 Description 800 Mb/s 1,600 Mb/s 3,200 Mb/s
Table 4 describes the speed code values for each of the newly supported speeds.
Table 4. Speed Codes Name SCODE_800_RATE SCODE_1600_RATE SCODE_3200_RATE Value 3 4 5 Description 800 Mb/s 1,600 Mb/s 3,200 Mb/s
REQUEST_ASYNC_READ
u.AsyncRead.nBlockSize Specifies the size of each individual block within the data stream that is read as a whole from the 1394 node. If this parameter is zero, the maximum packet size for the device and speed selected is used to issue these read requests. You can specify the new values in Table 2 for the nBlockSize parameter. We recommend that client drivers set the nBlockSize parameter to 0 so that the 1394 bus driver uses the maximum supported value.
REQUEST_ASYNC_WRITE
u.AsyncWrite.nBlockSize Specifies the size of each individual block within the data stream that is written as a whole to the 1394 node. If this parameter is zero, then the maximum packet size for the selected speed is used to divide these write requests. You can specify the new values in Table 2 for the nBlockSize parameter. We recommend that client drivers set the nBlockSize parameter to 0 so that the 1394 bus driver uses the maximum supported value.
REQUEST_ISOCH_ALLOCATE_BANDWIDTH
u.IsochAllocateBandwidth.fulSpeed Specifies the connection speed to use to allocate bandwidth. The possible speed values are SPEED_FLAGS_xxx, where xxx is the (approximate) transfer rate in mbps. u.IsochAllocateBandwidth.SpeedSelected Specifies the actual speed that is selected to allocate bandwidth. The value is one of SPEED_FLAGS_xxx (see the fulSpeed member description).
You can specify the new values in Table 3 for the fulSpeed parameter. The new 1394 bus driver can return the new values in Table 3 in the SpeedSelected parameter.
REQUEST_ISOCH_ALLOCATE_RESOURCES
u.IsochAllocateResources.fulSpeed Specifies the connection speed to use to communicate on the channel. The possible speed values are SPEED_FLAGS_xxx, where xxx is the (approximate) transfer rate in mbps. You can specify the new values in Table 3 for the fulSpeed parameter.
REQUEST_ISOCH_FREE_BANDWIDTH
u.IsochFreeBandwidth.fulSpeed Specifies the connection speed to use to free bandwidth. The possible speed values are SPEED_FLAGS_xxx, where xxx is the (approximate) transfer rate in mbps. You can specify the new values in Table 3 for the fulSpeed parameter. The new 1394 bus driver uses the fulSpeed parameter only when the IRB_FLAG_ALLOW_REMOTE_FREE flag is set and the IRB_FLAG_USE_PRE_CALCULATE_VALUE flag is not set in the Flags parameter of the IRB. In all other situations, the new 1394 bus driver ignores the fulSpeed parameter.
REQUEST_SET_DEVICE_XMIT_PROPERTIES
u.SetDeviceXmitProperties.fulSpeed Specifies the maximum speed for transactions to the device. The possible speed values are SPEED_FLAGS_xxx, where xxx is the (approximate) transfer rate in mbps. You can specify the new values in Table 3 for the fulSpeed parameter.
REQUEST_ASYNC_STREAM
u.AsyncStream.nSpeed Specifies the transfer rate. The possible speed values are SPEED_FLAGS_xxx, where xxx is the (approximate) transfer rate in mbps. You can specify the new values in Table 3 for the nSpeed parameter.
REQUEST_ISOCH_MODIFY_STREAM_PROPERTIES
u.IsochModifyStreamProperties.fulSpeed Specifies the maximum speed for transactions to the device. The possible speed values are SPEED_FLAGS_xxx, where xxx is the (approximate) transfer rate in mbps. You can specify the new values in Table 3 for the fulSpeed parameter.
REQUEST_GET_SPEED_BETWEEN_DEVICES
u.GetMaxSpeedBetweenDevices.fulSpeed Specifies the maximum possible transaction speed between the source device and the set of destination devices. The returned value is the maximum speed that all devices simultaneously support. The possible speed values are SPEED_FLAGS_xxx, where xxx is the (approximate) transfer rate in mbps. You can return the new values in Table 3 in the fulSpeed parameter. A client driver can also specify USE_SCODE_SPEED flag in the u.GetMaxSpeedBetweenDevices.fulFlags parameter to request that an SCODE_xxx_RATE speed code value, as defined in Table 4, be returned in the fulSpeed parameter instead of a SPEED_FLAGS_xxx value.
You can use the REQUEST_GET_LOCAL_HOST_INFO I/O request with this new nLevel value to determine whether the 1394 bus driver is the new 1394 bus driver or the legacy 1394 bus driver. The legacy 1394 bus driver returns a status value of STATUS_INVALID_PARAMETER if the nLevel parameter is set to GET_HOST_DDI_VERSION. The new 1394 bus driver returns a status value of STATUS_SUCCESS. If you set the u.GetLocalHostInformation.nLevel parameter to GET_HOST_DDI_VERSION, then the u.GetLocalHostInformation.Information parameter must point to a data structure of the following type:
typedef struct _GET_LOCAL_HOST_INFO8 { USHORT MajorVersion; USHORT MinorVersion; } GET_LOCAL_HOST_INFO8, *PGET_LOCAL_HOST_INFO8;
The new 1394 bus driver sets the MajorVersion and MinorVersion members of this structure to the values in Table 6.
Table 6. DDI Version Values Name BUS1394_DDI_MAJOR_VERSION BUS1394_DDI_MINOR_VERSION Description The major version of the 1394 bus driver interface. The minor version of the 1394 bus driver interface.
This information can eliminate the need for a 1394 client driver to synchronize the retrieval of the generation count, node ids, and other information, with its bus reset notification handler. To register for extended bus reset notifications, a client driver uses the existing REQUEST_BUS_RESET_NOTIFICATION I/O request and specifies the new EXTENDED_NOTIFICATION_ROUTINE flag in the u.BusResetNotification.fulFlags parameter. When the EXTENDED_NOTIFICATION_ROUTINE flag is specified, then the Context parameter that is passed to the ResetRoutine points to a data structure of the following type:
typedef struct _BUS_RESET_DATA { PVOID ResetContext; ULONG GenerationCount; NODE_ADDRESS DeviceNodeId; NODE_ADDRESS LocalNodeId; UCHAR SpeedToNode; } BUS_RESET_DATA, *PBUS_RESET_DATA;
Members
ResetContext The argument that is specified in the u.BusResetNotification.ResetContext parameter when the REQUEST_BUS_RESET_NOTIFICATION request is sent. GenerationCount The current generation of the 1394 bus. DeviceNodeId The 1394 address for the device. LocalNodeId The 1394 address for the local host. SpeedToNode The negotiated speed to the device. This value is a speed code value, as defined in Table 4.
REQUEST_SEND_PHY_PACKET
This is a new DDI to send 1394 PHY packets. It replaces the REQUEST_SEND_PHY_CONFIG_PACKET DDI.
The following are the relevant members of the IRB for this request:
typedef struct _IRB { ULONG FunctionNumber; . . . union { struct { ULONG Flags; ULONG GenerationCount; ULARGE_INTEGER PhyPacket; } SendPhyPacket; . . . } u; } IRB;
IRB Input
FunctionNumber REQUEST_SEND_PHY_PACKET u.SendPhyPacket.Flags Specifies any nondefault settings for this operation. The following flags are provided:
Flag ASYNC_FLAGS_NO_STATUS Description Always return success from the send PHY packet operation, regardless of whether the send PHY packet succeeds or fails.
u.SendPhyPacket.GenerationCount Specifies the bus reset generation as known by the device driver that submits this request. If the specified generation count does not match the actual generation of the bus, this request is returned with a status of STATUS_INVALID_GENERATION. u.SendPhyPacket.PhyPacket Specifies the 64-bit PHY packet that is sent to the 1394 bus. I/O Status Block If successful, the new 1394 bus driver sets Irp->IoStatus.Status to STATUS_SUCCESS. If u.SendPhyPacket.GenerationCount does not match the current bus generation count, the new 1394 bus driver sets Irp->IoStatus.Status to STATUS_INVALID_GENERATION.
REQUEST_RECEIVE_PHY_PACKETS
This is a new DDI to receive 1394 PHY packets. The following are the relevant members of the IRB for this request:
typedef struct _IRB { ULONG FunctionNumber; . . . union {
June 18, 2009 2009 Microsoft Corporation. All rights reserved.
IRB Input
FunctionNumber REQUEST_RECEIVE_PHY_PACKET u.ReceivePhyPackets.Flags Specifies whether a callback should be registered or deactivated. Use REGISTER_PHY_PACKET_NOTIFICATION to register PhyPacketRoutine as the callback. Use DEREGISTER_PHY_PACKET_NOTIFICATION to deactivate any previously registered callback. u.ReceivePhyPackets.PhyPacketRoutine Points to the notification routine for received PHY packets. The following is a prototype for the notification routine:
void PhyPacketRoutine( __in PVOID __in ULONG __in ULARGE_INTEGER ); Context, GenerationCount, PhyPacket
Parameters
Context The argument that is specified in the u.ReceivePhyPackets.PhyPacketContext parameter when the REQUEST_RECEIVE_PHY_PACKET request is sent. GenerationCount The generation count of the bus for this PHY packet. PhyPacket The 64-bit PHY packet that is received from the 1394 bus. u. ReceivePhyPackets.PhyPacketContext Specifies the Context argument to be passed to the PhyPacketRoutine.
Operation
The following are the relevant members of the IRB for this request:
typedef struct _IRB { ULONG FunctionNumber; . . . union { struct { ULONG GenerationCount; PCROM ConfigRom; ULONG UnitDirectoryIndex; ULONG UnitDependentDirectoryIndex; ULONG VendorLeafIndex; ULONG ModelLeafIndex; } GetConfigRom; . . . } u; } IRB;
IRB Input
FunctionNumber REQUEST_GET_CONFIG_ROM u.GetConfigRom.GenerationCount Receives the generation of the bus for which the contents of this configuration ROM was retrieved. u.GetConfigRom.ConfigRom A structure that receives the contents of the node's configuration ROM. u.GetConfigRom.UnitDirectoryIndex Receives the index to the nodes unit directory in its configuration ROM. This is an index to the Entries array in the u.GetConfigRom.ConfigRom structure. u.GetConfigRom.UnitDependentDirectoryIndex Receives the index to the node's unit dependent directory in its configuration ROM. This is an index to the Entries array in the u.GetConfigRom.ConfigRom structure. u.GetConfigRom.VendorLeafIndex Receives the index to the node's vendor textual leaf in the configuration ROM. This is an index to the Entries array in the u.GetConfigRom.ConfigRom structure. u.GetConfigRom.ModelLeafIndex Receives the index to the node's model textual leaf in the configuration ROM. This is an index to the Entries array in the u.GetConfigRom.ConfigRom structure.
Resources
Windows Driver Kit on MSDN http://msdn.microsoft.com/en-us/library/aa972908.aspx IEEE 1394 Bus http://msdn.microsoft.com/en-us/library/ms789423.aspx IEEE http://www.ieee.org/ 1394 Trade Association http://www.1394ta.org/