Using LVDS in a iMX6Q/D from Barebox
gianluca
gianlucarenzi at eurekelettronica.it
Wed Feb 22 01:05:08 PST 2017
>>>
>>>> /* DISPLAY 1280x800 AMPIRE AM1280800N3TZ */
>>>> am128080n3tz: am1280800n3tz {
>>>> clock-frequency = <71000000>;
>>>> hactive = <1280>;
>>>> vactive = <800>;
>>>> hback-porch = <50>;
>>>> hfront-porch = <50>;
>>>> vback-porch = <5>;
>>>> vfront-porch = <5>;
>>>> hsync-len = <60>;
>>>> vsync-len = <13>;
>>>> hsync-active = <0>;
>>>> vsync-active = <0>;
>>>> de-active = <1>;
>>>> pixelclk-active = <0>;
>>>> };
>>>> /* DISPLAY 1024x600 AMPIRE AM-1024600LTM LVDS */
>>>> am1024600l: am1024600l {
>>>> clock-frequency = <51200000>;
>>>> hactive = <1024>;
>>>> vactive = <600>;
>>>> hback-porch = <0>;
>>>> hfront-porch = <320>;
>>>> vback-porch = <0>;
>>>> vfront-porch = <35>;
>>>> hsync-len = <1>;
>>>> vsync-len = <1>;
>>>> hsync-active = <0>;
>>>> vsync-active = <0>;
>>>> de-active = <1>;
>>>> pixelclk-active = <0>;
>>>> };
>>>> /* DISPLAY 800x480 */
>>>> ph800480t013: ph800480t013 {
>>>> clock-frequency = <33300000>;
>>>> hactive = <800>;
>>>> vactive = <480>;
>>>> hback-porch = <46>;
>>>> hfront-porch = <210>;
>>>> vback-porch = <23>;
>>>> vfront-porch = <22>;
>>>> hsync-len = <1>;
>>>> vsync-len = <1>;
>>>> hsync-active = <0>;
>>>> vsync-active = <0>;
>>>> de-active = <1>;
>>>> pixelclk-active = <0>;
>>>> };
>>>> };
>>>>
>>>> port at 4 {
>>>> reg = <4>;
>>>> lvds0_out: endpoint {
>>>> remote-endpoint = <&in_lvds0>;
>>>> };
>>>> };
>>>>
>>>> };
>>>> };
>>>
> Anyway, now I am doing the same stuff for compatibile property of the
> panel, because Linux wants to have a timing hardcoded in the
> panel-simple instead of getting them from the timing section of the
> device-tree.
>
> This is a very lack of feature to me. But now, it is quicker to use the
> bootloader to compile the correctness of the compatible property to a
> almost-identical-timings found in the panel-simple.c...
>
> The other way is to add a edid chip (@ 0x50) for every panel I add, so
> to let the EDID stuff to discover what is connected or not to the lvds
> board.
>
> This issue can not simply solved in this board, because I do have an
> internal eeprom at address 0x50, but it can not be usable for EDID stuff.
>
> So I have two options:
>
> 1- let the imx-ldb.c code in the kernel to probe (simple-panel and edid)
> and *add* a way to parse the device-tree for adding mode timing property
> using the display-timing stuff. (this means kernel patch)
>
> 2- look for a common timings from an existing displays in simple-panel.c
> and pass them to the compatibile property of the panel in the
> device-tree via bootloader.
>
> The step no.2 is the quickest to me. But the ugliest too. ;-)
>
> Any hint?
> Regards,
Looking at the parallel-display.c (drivers/gpu/drm/imx) in the function
imx_pd_connector_get_modes() there are 3 ways of defining the
display-timing:
> struct imx_parallel_display *imxpd = con_to_imxpd(connector);
> struct device_node *np = imxpd->dev->of_node;
> int num_modes = 0;
>
1st mode: getting mode from panel compatibile string, i.e. like having:
compatible = "innolux,g101ice_l01", "simple-panel";
in the device-tree.
> if (imxpd->panel && imxpd->panel->funcs &&
> imxpd->panel->funcs->get_modes) {
> num_modes = imxpd->panel->funcs->get_modes(imxpd->panel);
> if (num_modes > 0)
> return num_modes;
> }
>
2nd mode: having a edid eeprom somewhere connected to the parallel
display on i2c.
> if (imxpd->edid) {
> drm_mode_connector_update_edid_property(connector, imxpd->edid);
> num_modes = drm_add_edid_modes(connector, imxpd->edid);
> }
>
3rd mode: parsing the device-tree for a node with display mode of native
mode property.
> if (np) {
> struct drm_display_mode *mode = drm_mode_create(connector->dev);
> int ret;
>
> if (!mode)
> return -EINVAL;
>
> ret = of_get_drm_display_mode(np, &imxpd->mode,
> &imxpd->bus_flags,
> OF_USE_NATIVE_MODE);
> if (ret)
> return ret;
>
> drm_mode_copy(mode, &imxpd->mode);
> mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
> drm_mode_probed_add(connector, mode);
> num_modes++;
> }
>
> return num_modes;
The 3rd option lacks in the imx-ldb.c device drivers.
If added this could be a simple way of using the correct timings in the
device-tree to pass to panel in ldb device driver.
Any comment?
--
Eurek s.r.l. |
Electronic Engineering | http://www.eurek.it
via Celletta 8/B, 40026 Imola, Italy | Phone: +39-(0)542-609120
p.iva 00690621206 - c.f. 04020030377 | Fax: +39-(0)542-609212
More information about the barebox
mailing list