int fbtft_write_spi(struct fbtft_par *par, void *buf, size_t len) { struct spi_transfer t = { .tx_buf = buf, .len = len, }; struct spi_message m; fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len, "%s(len=%d): ", func, len); if (!par->spi) { dev_err(par->info->device, "%s: par->spi is unexpectedly NULL\n", func); return -1; } spi_message_init(&m); if (par->txbuf.dma && buf == par->txbuf.buf) { t.tx_dma = par->txbuf.dma; m.is_dma_mapped = 1; } spi_message_add_tail(&t, &m); return spi_sync(par->spi, &m); }逐行中文注释
时间: 2024-04-02 15:33:01 浏览: 99
mmc_spi.rar_linux mmc_spi
// 这个函数用于通过 SPI 通信向显示器写入数据
int fbtft_write_spi(struct fbtft_par *par, void *buf, size_t len) {
// 创建一个 SPI 传输结构体,包含传输数据的缓冲区和长度
struct spi_transfer t = {
.tx_buf = buf, // 指向传输数据缓冲区的指针
.len = len, // 传输数据缓冲区的长度(字节数)
};
// 创建一个 SPI 消息结构体
struct spi_message m;
// 打印传输数据缓冲区内容的十六进制形式,用于调试
fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len,
"%s(len=%d): ", func, len);
// 检查 SPI 设备指针是否合法
if (!par->spi) {
dev_err(par->info->device,
"%s: par->spi is unexpectedly NULL\n", func);
return -1; // 如果指针为空,返回错误代码
}
// 初始化 SPI 消息结构体
spi_message_init(&m);
// 如果启用了 DMA 模式,并且传输数据缓冲区指针与 transmit buffer 相同
if (par->txbuf.dma && buf == par->txbuf.buf) {
t.tx_dma = par->txbuf.dma; // 设置传输数据缓冲区 DMA 地址
m.is_dma_mapped = 1; // 在 SPI 消息结构体中设置 DMA 标志
}
// 将 SPI 传输添加到 SPI 消息队列中
spi_message_add_tail(&t, &m);
// 使用 SPI 设备同步传输 SPI 消息
return spi_sync(par->spi, &m);
}
阅读全文