📄 dac960.c
字号:
*/static void DAC960_LP_QueueCommand(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandMailbox_T *NextCommandMailbox = Controller->V2.NextCommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; DAC960_LP_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 || Controller->V2.PreviousCommandMailbox2->Words[0] == 0) DAC960_LP_MemoryMailboxNewCommand(ControllerBaseAddress); Controller->V2.PreviousCommandMailbox2 = Controller->V2.PreviousCommandMailbox1; Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox; if (++NextCommandMailbox > Controller->V2.LastCommandMailbox) NextCommandMailbox = Controller->V2.FirstCommandMailbox; Controller->V2.NextCommandMailbox = NextCommandMailbox;}/* DAC960_LA_QueueCommandDualMode queues Command for DAC960 LA Series Controllers with Dual Mode Firmware.*/static void DAC960_LA_QueueCommandDualMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandMailbox_T *NextCommandMailbox = Controller->V1.NextCommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || Controller->V1.PreviousCommandMailbox2->Words[0] == 0) DAC960_LA_MemoryMailboxNewCommand(ControllerBaseAddress); Controller->V1.PreviousCommandMailbox2 = Controller->V1.PreviousCommandMailbox1; Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) NextCommandMailbox = Controller->V1.FirstCommandMailbox; Controller->V1.NextCommandMailbox = NextCommandMailbox;}/* DAC960_LA_QueueCommandSingleMode queues Command for DAC960 LA Series Controllers with Single Mode Firmware.*/static void DAC960_LA_QueueCommandSingleMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandMailbox_T *NextCommandMailbox = Controller->V1.NextCommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || Controller->V1.PreviousCommandMailbox2->Words[0] == 0) DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress); Controller->V1.PreviousCommandMailbox2 = Controller->V1.PreviousCommandMailbox1; Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) NextCommandMailbox = Controller->V1.FirstCommandMailbox; Controller->V1.NextCommandMailbox = NextCommandMailbox;}/* DAC960_PG_QueueCommandDualMode queues Command for DAC960 PG Series Controllers with Dual Mode Firmware.*/static void DAC960_PG_QueueCommandDualMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandMailbox_T *NextCommandMailbox = Controller->V1.NextCommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || Controller->V1.PreviousCommandMailbox2->Words[0] == 0) DAC960_PG_MemoryMailboxNewCommand(ControllerBaseAddress); Controller->V1.PreviousCommandMailbox2 = Controller->V1.PreviousCommandMailbox1; Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) NextCommandMailbox = Controller->V1.FirstCommandMailbox; Controller->V1.NextCommandMailbox = NextCommandMailbox;}/* DAC960_PG_QueueCommandSingleMode queues Command for DAC960 PG Series Controllers with Single Mode Firmware.*/static void DAC960_PG_QueueCommandSingleMode(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandMailbox_T *NextCommandMailbox = Controller->V1.NextCommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox); if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 || Controller->V1.PreviousCommandMailbox2->Words[0] == 0) DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress); Controller->V1.PreviousCommandMailbox2 = Controller->V1.PreviousCommandMailbox1; Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox; if (++NextCommandMailbox > Controller->V1.LastCommandMailbox) NextCommandMailbox = Controller->V1.FirstCommandMailbox; Controller->V1.NextCommandMailbox = NextCommandMailbox;}/* DAC960_PD_QueueCommand queues Command for DAC960 PD Series Controllers.*/static void DAC960_PD_QueueCommand(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; void *ControllerBaseAddress = Controller->BaseAddress; DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier; while (DAC960_PD_MailboxFullP(ControllerBaseAddress)) udelay(1); DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox); DAC960_PD_NewCommand(ControllerBaseAddress);}/* DAC960_ExecuteCommand executes Command and waits for completion.*/static void DAC960_ExecuteCommand(DAC960_Command_T *Command){ DAC960_Controller_T *Controller = Command->Controller; DECLARE_MUTEX_LOCKED(Semaphore); unsigned long ProcessorFlags; Command->Semaphore = &Semaphore; DAC960_AcquireControllerLock(Controller, &ProcessorFlags); DAC960_QueueCommand(Command); DAC960_ReleaseControllerLock(Controller, &ProcessorFlags); if (in_interrupt()) return; down(&Semaphore);}/* DAC960_V1_ExecuteType3 executes a DAC960 V1 Firmware Controller Type 3 Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller, DAC960_V1_CommandOpcode_T CommandOpcode, void *DataPointer){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandStatus_T CommandStatus; DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Type3.CommandOpcode = CommandOpcode; CommandMailbox->Type3.BusAddress = Virtual_to_Bus(DataPointer); DAC960_ExecuteCommand(Command); CommandStatus = Command->V1.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V1_NormalCompletion);}/* DAC960_V1_ExecuteType3D executes a DAC960 V1 Firmware Controller Type 3D Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller, DAC960_V1_CommandOpcode_T CommandOpcode, unsigned char Channel, unsigned char TargetID, void *DataPointer){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox; DAC960_V1_CommandStatus_T CommandStatus; DAC960_V1_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Type3D.CommandOpcode = CommandOpcode; CommandMailbox->Type3D.Channel = Channel; CommandMailbox->Type3D.TargetID = TargetID; CommandMailbox->Type3D.BusAddress = Virtual_to_Bus(DataPointer); DAC960_ExecuteCommand(Command); CommandStatus = Command->V1.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V1_NormalCompletion);}/* DAC960_V2_GeneralInfo executes a DAC960 V2 Firmware General Information Reading IOCTL Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller, DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode, void *DataPointer, unsigned int DataByteCount){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandStatus_T CommandStatus; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL; CommandMailbox->Common.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->Common.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->Common.DataTransferSize = DataByteCount; CommandMailbox->Common.IOCTL_Opcode = IOCTL_Opcode; CommandMailbox->Common.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Virtual_to_Bus(DataPointer); CommandMailbox->Common.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->Common.DataTransferSize; DAC960_ExecuteCommand(Command); CommandStatus = Command->V2.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V2_NormalCompletion);}/* DAC960_V2_ControllerInfo executes a DAC960 V2 Firmware Controller Information Reading IOCTL Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V2_ControllerInfo(DAC960_Controller_T *Controller, DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode, void *DataPointer, unsigned int DataByteCount){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandStatus_T CommandStatus; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL; CommandMailbox->ControllerInfo.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->ControllerInfo.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->ControllerInfo.DataTransferSize = DataByteCount; CommandMailbox->ControllerInfo.ControllerNumber = 0; CommandMailbox->ControllerInfo.IOCTL_Opcode = IOCTL_Opcode; CommandMailbox->ControllerInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Virtual_to_Bus(DataPointer); CommandMailbox->ControllerInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->ControllerInfo.DataTransferSize; DAC960_ExecuteCommand(Command); CommandStatus = Command->V2.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V2_NormalCompletion);}/* DAC960_V2_LogicalDeviceInfo executes a DAC960 V2 Firmware Controller Logical Device Information Reading IOCTL Command and waits for completion. It returns true on success and false on failure.*/static boolean DAC960_V2_LogicalDeviceInfo(DAC960_Controller_T *Controller, DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode, unsigned short LogicalDeviceNumber, void *DataPointer, unsigned int DataByteCount){ DAC960_Command_T *Command = DAC960_AllocateCommand(Controller); DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; DAC960_V2_CommandStatus_T CommandStatus; DAC960_V2_ClearCommand(Command); Command->CommandType = DAC960_ImmediateCommand; CommandMailbox->LogicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL; CommandMailbox->LogicalDeviceInfo.CommandControlBits .DataTransferControllerToHost = true; CommandMailbox->LogicalDeviceInfo.CommandControlBits .NoAutoRequestSense = true; CommandMailbox->LogicalDeviceInfo.DataTransferSize = DataByteCount; CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber = LogicalDeviceNumber; CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = IOCTL_Opcode; CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentDataPointer = Virtual_to_Bus(DataPointer); CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress .ScatterGatherSegments[0] .SegmentByteCount = CommandMailbox->LogicalDeviceInfo.DataTransferSize; DAC960_ExecuteCommand(Command); CommandStatus = Command->V2.CommandStatus; DAC960_DeallocateCommand(Command); return (CommandStatus == DAC960_V2_NormalCompletion);}/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -