📄 dac960.c.txt
字号:
any problems,send mail to sindybear@163.com
相关文件
DAC960.h
***************************基本数据结构******************************************
int DAC960_ControllerCount = 0; //检测到的dac控制器的数目
int DAC960_ActiveControllerCount = 0; //活动DAC控制器的数目
//控制器阵列的列表
static DAC960_Controller_T *DAC960_Controllers[DAC960_MaxControllers] = { NULL };
//使用普通的块设备的接口方式,也就是使用默认的read和write方式
static BlockDeviceOperations_T
DAC960_BlockDeviceOperations =
{ owner: THIS_MODULE,
open: DAC960_Open,
release: DAC960_Release,
ioctl: DAC960_IOCTL };
*********************************************************************************
**********************************初始化函数*************************************
(1)static int DAC960_Initialize(void)
DAC960_DetectControllers(DAC960_P_Controller);
……
DAC960_RegisterBlockDevice(Controller) //这个函数是最主要的函数
(2)static void DAC960_DetectControllers(DAC960_HardwareType_T HardwareType)
//这个函数询问pci配置空间来检测控制器的类型
(3)static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
RequestQueue = BLK_DEFAULT_QUEUE(MajorNumber); //定义请求队列
blk_init_queue(RequestQueue, DAC960_RequestFunction); //定义队列处理函数
blk_queue_headactive(RequestQueue, 0); //以下定义的都是一般的处理
RequestQueue->back_merge_fn = DAC960_BackMergeFunction;
RequestQueue->front_merge_fn = DAC960_FrontMergeFunction;
RequestQueue->merge_requests_fn = DAC960_MergeRequestsFunction;
RequestQueue->queuedata = Controller;
Controller->RequestQueue = RequestQueue;
*********************************************************************************
***********************************请求队列处理函数**********************************
(1)static void DAC960_RequestFunction(RequestQueue_T *RequestQueue)
这个事主处理函数,相当于make_request函数的地位
DAC960_ProcessRequests(Controller); //这是唯一的请求队列处理函数
(2)static inline void DAC960_ProcessRequests(DAC960_Controller_T *Controller)
while (DAC960_ProcessRequest(Controller, Counter++ == 0)) ; //尽可能多地处理请求
(3)static boolean DAC960_ProcessRequest(DAC960_Controller_T *Controller,boolean WaitForCommand)
…… //得到请求队列的指针
while (true)
…… //分配一个command结构,如果不能满足的话,就等待
…… //对得到的command进行设置
blkdev_dequeue_request(Request); //摘掉请求
blkdev_release_request(Request);
DAC960_QueueReadWriteCommand(Command); //执行命令
(4)static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *Command)
//对command重的mailbox参数进行设置
DAC960_QueueCommand(Command); //调用一定的controller的处理命令进行处理
(5)static void DAC960_P_QueueCommand(DAC960_Command_T *Command)
//举一个例子
…… //进行设置
while (DAC960_PD_MailboxFullP(ControllerBaseAddress))
udelay(1); //如果邮箱满了,等待一会
DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox); //写邮箱
DAC960_PD_NewCommand(ControllerBaseAddress
(6)void DAC960_PD_WriteCommandMailbox
//这个函数在文件DAC960.c中
writel(CommandMailbox->Words[0],ControllerBaseAddress + DAC960_PD_CommandOpcodeRegisterOffset);
…… //写寄存器,进行传输运行
*************************************************************************************
****************************基本函数*********************************************
*********************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -