⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dac960.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 5 页
字号:
*/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 + -