What are the steps to bring up a DSI panel?

Hello,

Ive been trying to bring up a DSI panel for a while. Can someone explain in simple terms the steps to configure and bring up a DSI panel on the TX1 Jetson?

Thank you in advance!

m-walker,

Please note that below steps are only for tx1. TX2 would have other setting to setup.

Start from what you flash to tegra.

  1. There is a default DSI enabled on TX1. To enable this board, you need to flash p2371-2180.conf under Linux_for_Tegra.

  2. You could check this line under that config -> BCFFILE=“bootloader/t210ref/cfg/board_config_p2597.xml”;

  3. There would be a field named “display” and id = 1937.

  4. Check “kernel/display/drivers/video/tegra/dc/panel/board-panel.c” -> internal_panel_select_by_disp_board_id

and you will see case BOARD_E1937, which matches the id. It would set is_dsi_a_1200_1920_8_0 to 1.

  1. That setting in step 4 would set up a ops
if (np_panel && pdata && dc_out)                                                                                                                                                           
                         tegra_panel_register_ops(dc_out,                                                                                                                                                   
                                 &dsi_a_1200_1920_8_0_ops);
  1. You could refer to “panel-a-1200-1920-8-0.c”. We call it “the panel driver” for panel-a-1200_1920.

  2. dc.c -> tegra_dc_probe is the one that use those ops.

Add some logs in above files would be helpful for debug.

Thank you for your quick reply!

I followed your steps and I made the following modifications to board-panel.c

static void tegra_pwm_bl_ops_reg_based_on_disp_board_id(struct device *dev)
{
	struct board_info display_board;

	<b>bool is_dsi_a_1200_1920_8_0 = true;</b>
	bool is_dsi_a_1200_800_8_0 = false;
	bool is_edp_i_1080p_11_6 = false;
	bool is_edp_a_1080p_14_0 = false;
	bool is_edp_s_2160p_15_6 = false;
static struct device_node
	*internal_panel_select_by_disp_board_id(
		struct tegra_dc_platform_data *pdata)
{
	struct device_node *np_panel = NULL;
	struct tegra_dc_out *dc_out = NULL;
	struct board_info display_board;

	<b>bool is_dsi_a_1200_1920_8_0 = true;</b>
	bool is_dsi_a_1200_800_8_0 = false;
	bool is_edp_i_1080p_11_6 = false;
	bool is_edp_a_1080p_14_0 = false;
	bool is_edp_s_2160p_15_6 = false;
case BOARD_E1937:
			if (np_panel && pdata && dc_out)
				tegra_panel_register_ops(dc_out,
					&dsi_a_1200_1920_8_0_ops);

Here is the log error messages

[    0.511745] DC OR NODE connected to /host1x/sor1
[    0.511838] display board info: id 0xffff, fab 0x0
[    0.512092] panel_select fail by _node_status
[    0.512148] display board info: id 0xffff, fab 0x0
[    0.512374] panel_select fail by _node_status
[    0.512401] generic_infoframe_type: 0x87
[    0.512577] tegradc tegradc.1: DT parsed successfully
[    0.512633] tegradc tegradc.1: Display dc.ffffff8000980000 registered with id=0
[    0.513396] display board info: id 0xffff, fab 0x0
[    0.513645] panel_select fail by _node_status

What would be causing this issue?

np_dsi = of_find_node_by_path(DSI_NODE);
  	if (np_dsi) {
  		for_each_available_child_of_node(np_dsi, np_panel) {
  			if (np_panel)
  				break;
  		}
  	}

This error comes because your device tree seems wrong. Please refer to our ours.

Hello WayneWWW,
Thank you for your reply!

Can you give me an example of how to modify the tegra210-jetson-cv-base-p2597-2180-a00.dts and tegra210-jetson-tx1-p2597-2180-a01-devkit.dts what other files should I modify?

tegra210-jetson-cv-base-p2597-2180-a00.dts already includes the part of DSI dt.