summaryrefslogtreecommitdiff
path: root/spb/SkeletonI2C/internal.h
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /spb/SkeletonI2C/internal.h
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'spb/SkeletonI2C/internal.h')
-rw-r--r--spb/SkeletonI2C/internal.h293
1 files changed, 293 insertions, 0 deletions
diff --git a/spb/SkeletonI2C/internal.h b/spb/SkeletonI2C/internal.h
new file mode 100644
index 00000000..3d102ba4
--- /dev/null
+++ b/spb/SkeletonI2C/internal.h
@@ -0,0 +1,293 @@
+/*++
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ internal.h
+
+Abstract:
+
+ This module contains the common internal type and function
+ definitions for the SPB controller driver.
+
+Environment:
+
+ kernel-mode only
+
+Revision History:
+
+--*/
+
+#ifndef _INTERNAL_H_
+#define _INTERNAL_H_
+
+#pragma warning(push)
+#pragma warning(disable:4512)
+#pragma warning(disable:4480)
+
+#define SI2C_POOL_TAG ((ULONG) 'C2IS')
+
+/////////////////////////////////////////////////
+//
+// Common includes.
+//
+/////////////////////////////////////////////////
+
+#include <initguid.h>
+#include <ntddk.h>
+#include <wdm.h>
+#include <wdf.h>
+#include <ntstrsafe.h>
+
+#include "SPBCx.h"
+#include "i2ctrace.h"
+
+
+/////////////////////////////////////////////////
+//
+// Hardware definitions.
+//
+/////////////////////////////////////////////////
+
+#include "skeletoni2c.h"
+
+/////////////////////////////////////////////////
+//
+// Resource and descriptor definitions.
+//
+/////////////////////////////////////////////////
+
+#include "reshub.h"
+
+//
+// I2C Serial peripheral bus descriptor
+//
+
+#include "pshpack1.h"
+
+typedef struct _PNP_I2C_SERIAL_BUS_DESCRIPTOR {
+ PNP_SERIAL_BUS_DESCRIPTOR SerialBusDescriptor;
+ ULONG ConnectionSpeed;
+ USHORT SlaveAddress;
+ // follwed by optional Vendor Data
+ // followed by PNP_IO_DESCRIPTOR_RESOURCE_NAME
+} PNP_I2C_SERIAL_BUS_DESCRIPTOR, *PPNP_I2C_SERIAL_BUS_DESCRIPTOR;
+
+#include "poppack.h"
+
+#define I2C_SERIAL_BUS_TYPE 0x01
+#define I2C_SERIAL_BUS_SPECIFIC_FLAG_10BIT_ADDRESS 0x0001
+
+/////////////////////////////////////////////////
+//
+// Settings.
+//
+/////////////////////////////////////////////////
+
+//
+// Power settings.
+//
+
+#define MONITOR_POWER_ON 1
+#define MONITOR_POWER_OFF 0
+
+#define IDLE_TIMEOUT_MONITOR_ON 2000
+#define IDLE_TIMEOUT_MONITOR_OFF 50
+
+//
+// Target settings.
+//
+
+typedef enum ADDRESS_MODE
+{
+ AddressMode7Bit,
+ AddressMode10Bit
+}
+ADDRESS_MODE, *PADDRESS_MODE;
+
+typedef struct PBC_TARGET_SETTINGS
+{
+ // TODO: Update this structure to include other
+ // target settings needed to configure the
+ // controller (i.e. connection speed, phase/
+ // polarity for SPI).
+
+ ADDRESS_MODE AddressMode;
+ USHORT Address;
+ ULONG ConnectionSpeed;
+}
+PBC_TARGET_SETTINGS, *PPBC_TARGET_SETTINGS;
+
+
+//
+// Transfer settings.
+//
+
+typedef enum BUS_CONDITION
+{
+ BusConditionFree,
+ BusConditionBusy,
+ BusConditionDontCare
+}
+BUS_CONDITION, *PBUS_CONDITION;
+
+typedef struct PBC_TRANSFER_SETTINGS
+{
+ // TODO: Update this structure to include other
+ // settings needed to configure the controller
+ // for a specific transfer.
+
+ BUS_CONDITION BusCondition;
+ BOOLEAN IsStart;
+ BOOLEAN IsEnd;
+}
+PBC_TRANSFER_SETTINGS, *PPBC_TRANSFER_SETTINGS;
+
+/////////////////////////////////////////////////
+//
+// Context definitions.
+//
+/////////////////////////////////////////////////
+
+typedef struct PBC_DEVICE PBC_DEVICE, *PPBC_DEVICE;
+typedef struct PBC_TARGET PBC_TARGET, *PPBC_TARGET;
+typedef struct PBC_REQUEST PBC_REQUEST, *PPBC_REQUEST;
+
+//
+// Device context.
+//
+
+struct PBC_DEVICE
+{
+ // TODO: Update this structure with variables that
+ // need to be stored in the device context.
+
+ // Handle to the WDF device.
+ WDFDEVICE FxDevice;
+
+ // Structure mapped to the controller's
+ // register interface.
+ PSKELETONI2C_REGISTERS pRegisters;
+ ULONG RegistersCb;
+ PHYSICAL_ADDRESS pRegistersPhysicalAddress;
+
+ // Target that the controller is currently
+ // configured for. In most cases this value is only
+ // set when there is a request being handled, however,
+ // it will persist between lock and unlock requests.
+ // There cannot be more than one current target.
+ PPBC_TARGET pCurrentTarget;
+
+ // Variables to track enabled interrupts
+ // and status between ISR and DPC.
+ WDFINTERRUPT InterruptObject;
+ ULONG InterruptMask;
+ ULONG InterruptStatus;
+
+ // Controller driver spinlock.
+ WDFSPINLOCK Lock;
+
+ // Delay timer used to stall between transfers.
+ WDFTIMER DelayTimer;
+
+ // The power setting callback handle
+ PVOID pMonitorPowerSettingHandle;
+};
+
+//
+// Target context.
+//
+
+struct PBC_TARGET
+{
+ // TODO: Update this structure with variables that
+ // need to be stored in the target context.
+
+ // Handle to the SPB target.
+ SPBTARGET SpbTarget;
+
+ // Target specific settings.
+ PBC_TARGET_SETTINGS Settings;
+
+ // Current request associated with the
+ // target. This value should only be non-null
+ // when this target is the controller's current
+ // target.
+ PPBC_REQUEST pCurrentRequest;
+};
+
+//
+// Request context.
+//
+
+struct PBC_REQUEST
+{
+ // TODO: Update this structure with variables that
+ // need to be stored in the request context.
+
+ //
+ // Variables that persist for the lifetime of
+ // the request. Specifically these apply to an
+ // entire sequence request (not just a single transfer).
+ //
+
+ // Handle to the SPB request.
+ SPBREQUEST SpbRequest;
+
+ // SPB request type.
+ SPB_REQUEST_TYPE Type;
+
+ // Number of transfers in sequence and
+ // index of the current one.
+ ULONG TransferCount;
+ ULONG TransferIndex;
+
+ // Total bytes transferred.
+ size_t TotalInformation;
+
+ // Current status of the request.
+ NTSTATUS Status;
+ BOOLEAN bIoComplete;
+
+
+ //
+ // Variables that are reused for each transfer within
+ // a [sequence] request.
+ //
+
+ // Pointer to the transfer buffer and length.
+ size_t Length;
+ PMDL pMdlChain;
+
+ // Position of the current transfer within
+ // the sequence and its associated controller
+ // settings.
+ SPB_REQUEST_SEQUENCE_POSITION SequencePosition;
+ PBC_TRANSFER_SETTINGS Settings;
+
+ // Direction of the current transfer.
+ SPB_TRANSFER_DIRECTION Direction;
+
+ // Time to delay before starting transfer.
+ ULONG DelayInUs;
+
+ // Interrupt flag indicating data is ready to
+ // be transferred.
+ ULONG DataReadyFlag;
+
+ // Bytes read/written in the current transfer.
+ size_t Information;
+};
+
+//
+// Declate contexts for device, target, and request.
+//
+
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(PBC_DEVICE, GetDeviceContext);
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(PBC_TARGET, GetTargetContext);
+WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(PBC_REQUEST, GetRequestContext);
+
+#pragma warning(pop)
+
+#endif // _INTERNAL_H_