| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "lib/mipi-dsi/mipi-dsi.h" |
| |
| namespace mipi_dsi { |
| |
| zx_status_t MipiDsi::CreateCommand(const uint8_t* tbuf, size_t tlen, uint8_t* rbuf, size_t rlen, |
| bool is_dcs, mipi_dsi_cmd_t* cmd) { |
| // Create a command packet |
| cmd->virt_chn_id = MIPI_DSI_VIRTUAL_CHAN_ID; |
| cmd->pld_data_list = tbuf; // tbuf is allowed to be null |
| cmd->pld_data_count = tlen; |
| cmd->rsp_data_list = rbuf; // rbuf is allowed to be null if rlen is 0 |
| cmd->rsp_data_count = rlen; |
| cmd->flags = 0; |
| cmd->dsi_data_type = MIPI_DSI_DT_UNKNOWN; |
| |
| switch (tlen) { |
| case 0: |
| if (is_dcs) { |
| printf("Missing DCS Command\n"); |
| return ZX_ERR_INVALID_ARGS; |
| } |
| if (rbuf && rlen > 0) { |
| cmd->dsi_data_type = MIPI_DSI_DT_GEN_SHORT_READ_0; |
| cmd->flags |= MIPI_DSI_CMD_FLAGS_ACK | MIPI_DSI_CMD_FLAGS_SET_MAX; |
| } else { |
| cmd->dsi_data_type = MIPI_DSI_DT_GEN_SHORT_WRITE_0; |
| } |
| break; |
| case 1: |
| if (rbuf && rlen > 0) { |
| cmd->dsi_data_type = is_dcs ? MIPI_DSI_DT_DCS_READ_0 : MIPI_DSI_DT_GEN_SHORT_READ_1; |
| cmd->flags |= MIPI_DSI_CMD_FLAGS_ACK | MIPI_DSI_CMD_FLAGS_SET_MAX; |
| } else { |
| cmd->dsi_data_type = is_dcs ? MIPI_DSI_DT_DCS_SHORT_WRITE_0 : MIPI_DSI_DT_GEN_SHORT_WRITE_1; |
| } |
| break; |
| case 2: |
| if (rbuf && rlen > 0) { |
| if (is_dcs) { |
| printf("Invalid DCS GEN READ Command!\n"); |
| return ZX_ERR_INVALID_ARGS; |
| } |
| cmd->dsi_data_type = MIPI_DSI_DT_GEN_SHORT_READ_2; |
| cmd->flags |= MIPI_DSI_CMD_FLAGS_ACK | MIPI_DSI_CMD_FLAGS_SET_MAX; |
| } else { |
| cmd->dsi_data_type = is_dcs ? MIPI_DSI_DT_DCS_SHORT_WRITE_1 : MIPI_DSI_DT_GEN_SHORT_WRITE_2; |
| } |
| break; |
| default: |
| if (rbuf || rlen > 0) { |
| printf("Invalid DSI GEN READ Command!\n"); |
| return ZX_ERR_INVALID_ARGS; |
| } else { |
| cmd->dsi_data_type = is_dcs ? MIPI_DSI_DT_DCS_LONG_WRITE : MIPI_DSI_DT_GEN_LONG_WRITE; |
| } |
| break; |
| } |
| |
| // packet command has been created. |
| return ZX_OK; |
| } |
| |
| } // namespace mipi_dsi |