ufshcd_lrb中哪里配置数据的写入地址
时间: 2024-03-08 09:45:35 浏览: 12
在 UFS 存储设备中,ufshcd_lrb 中的数据写入地址是由命令描述符 (Command Descriptor) 中的 `Data Buffer Pointer` 字段指定的。命令描述符是一个数据结构,用于描述 UFS 设备的操作指令,包括读取、写入、擦除等操作。其中,`Data Buffer Pointer` 字段用于指定数据缓冲区的地址。
在 UFS 控制器中,命令描述符通常是通过 DMA 方式进行传输的。在配置 DMA 传输时,需要指定数据缓冲区的物理地址和长度等信息,以便 UFS 控制器能够正确地读取和写入数据。这些信息通常是由设备驱动程序在命令执行前进行配置的。
因此,如果需要配置 ufshcd_lrb 中数据的写入地址,需要通过设备驱动程序设置命令描述符中的 `Data Buffer Pointer` 字段,将其指向相应的数据缓冲区地址。同时,还需要确保 DMA 传输的配置信息正确无误,以便 UFS 控制器能够正确地访问数据缓冲区。
相关问题
怎么配置ufshcd_lrb数据的起始地址
对于 UFS 存储设备,ufshcd_lrb 数据的起始地址可以通过在设备树中配置相应的属性进行设置。具体的属性名称和取值可能因不同的硬件平台而有所区别,但通常包括以下几个方面:
1. "reg" 属性:用于指定 LRB 区域在 UFS 控制器的寄存器空间中的地址范围。通常包括起始地址和长度两个值,单位为字节或者页(Page)。
2. "interrupts" 属性:用于指定中断号或者中断名称,以便 UFS 控制器在 LRB 操作完成后向系统发送中断信号,以便进行处理。
3. "dma-coherent" 属性:用于指定是否需要启用 DMA 一致性,以确保 LRB 数据在传输过程中不会出现错误或乱序。
根据具体的硬件平台和系统架构,这些属性可能还包括其他的配置项和取值。需要根据具体情况进行设置。
上面的ufshcd_prepare_lrb能展开吗?
当然可以展开,ufshcd_prepare_lrb函数是用于填充命令请求块的,其源代码如下所示:
```c
static void ufshcd_prepare_lrb(struct ufshcd_lrb *lrb, struct ufs_cmd *cmd,
struct ufshcd_host *host)
{
struct ufs_dev_cmd *dev_cmd = &cmd->dev_cmd;
/* 填充命令请求块 */
lrb->cmd = cmd;
lrb->tag = cmd->tag;
lrb->sense_buffer = cmd->sense_buffer;
lrb->sense_buffer_dma = cmd->sense_buffer_dma;
lrb->ucd = cmd->ucd;
lrb->ucd_dma = cmd->ucd_dma;
lrb->data_dir = cmd->data_dir;
lrb->data_sg = cmd->data_sg;
lrb->n_data_sg = cmd->n_data_sg;
lrb->data_buffer = cmd->data_buffer;
lrb->data_dma = cmd->data_dma;
lrb->residue_sg = cmd->residue_sg;
lrb->residue_ptr = cmd->residue_ptr;
lrb->residue_len = cmd->residue_len;
lrb->status = 0;
lrb->state = UFS_LRB_STATE_PENDING;
lrb->t_completed = 0;
lrb->done = cmd->done;
lrb->host = host;
lrb->xfer_mode = dev_cmd->xfer_mode;
lrb->task_tag = dev_cmd->task_tag;
lrb->cmd_type = dev_cmd->cmd_type;
lrb->cmd_set_type = dev_cmd->cmd_set_type;
lrb->dev_lun = dev_cmd->dev_lun;
lrb->data_len = dev_cmd->data_len;
lrb->cmd_len = dev_cmd->cmd_len;
lrb->cmd_data = dev_cmd->cmd_data;
lrb->resp_len = dev_cmd->resp_len;
lrb->resp_data = dev_cmd->resp_data;
}
```
该函数将UFS命令相关的各种数据填充到命令请求块中,以便在将命令添加到命令队列中时使用。其中,lrb表示命令请求块,cmd表示UFS命令,host表示UFS主机控制器。
具体来说,该函数将命令请求块的cmd字段设置为UFS命令,将tag字段设置为UFS命令的标签,将sense_buffer和sense_buffer_dma分别设置为UFS命令的感知缓冲区和感知缓冲区的DMA地址,将ucd和ucd_dma分别设置为UFS命令的UCD缓冲区和UCD缓冲区的DMA地址,将data_dir、data_sg、n_data_sg、data_buffer和data_dma分别设置为UFS命令的数据方向、数据段、数据段数量、数据缓冲区和数据缓冲区的DMA地址等。
此外,该函数还将命令请求块的其他字段设置为一些默认值,如状态为UFS_LRB_STATE_PENDING,完成时间为0,状态为0等。
总之,ufshcd_prepare_lrb函数的作用是将UFS命令填充到命令请求块中,以便在将命令添加到命令队列中时使用。