struct sharp_panel { struct drm_panel base; /* the datasheet refers to them as DSI-LINK1 and DSI-LINK2 */ struct mipi_dsi_device *link1; struct mipi_dsi_device *link2;
err = mipi_dsi_dcs_set_column_address(left, 0, mode->hdisplay / 2 - 1); if (err < 0) {
dev_err(&left->dev, "failed to set column address: %d\n", err); return err;
}
err = mipi_dsi_dcs_set_page_address(left, 0, mode->vdisplay - 1); if (err < 0) {
dev_err(&left->dev, "failed to set page address: %d\n", err); return err;
}
err = mipi_dsi_dcs_set_column_address(right, mode->hdisplay / 2,
mode->hdisplay - 1); if (err < 0) {
dev_err(&right->dev, "failed to set column address: %d\n", err); return err;
}
err = mipi_dsi_dcs_set_page_address(right, 0, mode->vdisplay - 1); if (err < 0) {
dev_err(&right->dev, "failed to set page address: %d\n", err); return err;
}
return 0;
}
staticint sharp_panel_prepare(struct drm_panel *panel)
{ struct sharp_panel *sharp = to_sharp_panel(panel);
u8 format = MIPI_DCS_PIXEL_FMT_24BIT; int err;
err = regulator_enable(sharp->supply); if (err < 0) return err;
/* * According to the datasheet, the panel needs around 10 ms to fully * power up. At least another 120 ms is required before exiting sleep * mode to make sure the panel is ready. Throw in another 20 ms for * good measure.
*/
msleep(150);
err = mipi_dsi_dcs_exit_sleep_mode(sharp->link1); if (err < 0) {
dev_err(panel->dev, "failed to exit sleep mode: %d\n", err); goto poweroff;
}
/* * The MIPI DCS specification mandates this delay only between the * exit_sleep_mode and enter_sleep_mode commands, so it isn't strictly * necessary here.
*/ /* msleep(120);
*/
/* set left-right mode */
err = sharp_panel_write(sharp, 0x1000, 0x2a); if (err < 0) {
dev_err(panel->dev, "failed to set left-right mode: %d\n", err); goto poweroff;
}
err = mipi_dsi_dcs_set_pixel_format(sharp->link1, format); if (err < 0) {
dev_err(panel->dev, "failed to set pixel format: %d\n", err); goto poweroff;
}
/* * TODO: The device supports both left-right and even-odd split * configurations, but this driver currently supports only the left- * right split. To support a different mode a mechanism needs to be * put in place to communicate the configuration back to the DSI host * controller.
*/
err = sharp_setup_symmetrical_split(sharp->link1, sharp->link2,
sharp->mode); if (err < 0) {
dev_err(panel->dev, "failed to set up symmetrical split: %d\n",
err); goto poweroff;
}
err = mipi_dsi_dcs_set_display_on(sharp->link1); if (err < 0) {
dev_err(panel->dev, "failed to set display on: %d\n", err); goto poweroff;
}
/* wait for 6 frames before continuing */
sharp_wait_frames(sharp, 6);
/* register a panel for only the DSI-LINK1 interface */ if (secondary) {
sharp = devm_drm_panel_alloc(&dsi->dev, __typeof(*sharp), base,
&sharp_panel_funcs,
DRM_MODE_CONNECTOR_DSI); if (IS_ERR(sharp)) {
put_device(&secondary->dev); return PTR_ERR(sharp);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.