上面的ufs_cmd怎么配置呢?
时间: 2024-03-02 14:54:27 浏览: 18
在使用ufshcd_prepare_lrb函数之前,需要先配置UFS命令。UFS命令的配置包括以下几个步骤:
1. 定义ufs_cmd结构体变量,例如:
```c
struct ufs_cmd cmd;
```
2. 初始化ufs_cmd结构体,包括设置命令类型、命令参数、数据方向、数据缓冲区、数据长度等,例如:
```c
cmd.cmd_type = UFS_CMD_TYPE_QUERY_REQ;
cmd.cmd_set_type = UFS_CMD_SET_UFS;
cmd.dev_lun = 0;
cmd.data_dir = DMA_FROM_DEVICE;
cmd.data_buffer = buffer;
cmd.data_dma = dma_addr;
cmd.data_len = len;
```
上述代码初始化了一个查询请求命令,命令参数设置为UFS命令集,设备LUN为0,数据方向为从设备到主机,数据缓冲区为buffer,数据缓冲区的DMA地址为dma_addr,数据长度为len。
3. 将ufs_cmd结构体传递给ufshcd_prepare_lrb函数,例如:
```c
ufshcd_prepare_lrb(&lrb, &cmd, host);
```
其中,lrb是命令请求块,host是UFS主机控制器。
通过以上步骤的配置,即可将UFS命令填充到命令请求块中,并添加到命令队列中等待执行。需要注意的是,不同的UFS命令可能需要不同的配置方式,具体应根据UFS命令的要求进行配置。
相关问题
ufs_clk_scaling
根据提供的引用内容,我可以回答你关于ufs_clk_scaling的问题。
ufs_clk_scaling是用于在UFS(Universal Flash Storage)控制器中实现时钟频率调节的功能。根据引用,如果ufs_clk_scaling被支持(即为true),则会执行以下操作:
1. 初始化hba->clk_scaling.suspend_work和hba->clk_scaling.resume_work,用于在时钟频率调节过程中挂起和恢复工作。
2. 通过create_singlethread_workqueue(wq_name)创建一个专有的工作队列hba->clk_scaling.workq,用于处理时钟频率调节的工作。
而根据引用,ufs_clk_scaling的初始化是在ufs控制器的分配过程中完成的。具体步骤如下:
1. 调用scsi_host_alloc(&ufshcd_driver_template, sizeof(struct ufs_hba))来分配Scsi_host的空间。
2. 同时也为ufs host的私有数据struct ufs_hba分配空间。
3. 对scsi_host执行基本的初始化。
这样,ufs_clk_scaling就可以在UFS控制器中实现时钟频率调节的功能。
struct utp_upiu_cmd { __be32 exp_data_transfer_len; __u8 cdb[UFS_CDB_SIZE]; };
`struct utp_upiu_cmd` 是一个结构体,用于表示 UPIU (SCSI over USB Protocol) 命令。它通常在 USB Mass Storage 设备中使用,用于传输 SCSI 命令。
这里给出的 `struct utp_upiu_cmd` 只包含了两个字段:
- `exp_data_transfer_len`:表示期望的数据传输长度,是一个 Big Endian 的 32 位整数;
- `cdb`:表示 SCSI 命令块(Command Descriptor Block),长度为 `UFS_CDB_SIZE`,即 16 个字节,这里使用了一个无符号 8 位整数数组来表示。
需要注意的是,这里没有包含传输类型、标志、逻辑单元号等字段,因此这个结构体可能只是 `utp_upiu_cmd` 结构体的一部分,并不能完整地表示一个 UPIU 命令。