Using LVDS in a iMX6Q/D from Barebox

gianluca gianlucarenzi at eurekelettronica.it
Fri Feb 17 07:38:37 PST 2017


On 02/16/2017 04:50 PM, Lucas Stach wrote:
> Am Donnerstag, den 16.02.2017, 15:43 +0100 schrieb gianluca:
>> On 02/16/2017 08:28 AM, Sascha Hauer wrote:
>>> On Wed, Feb 15, 2017 at 03:34:55PM +0100, gianluca wrote:
>>>> On 02/15/2017 12:51 PM, Sascha Hauer wrote:
>>>>> On Tue, Feb 14, 2017 at 11:32:44AM +0100, gianluca wrote:
>>>>>> On 02/10/2017 08:35 AM, Sascha Hauer wrote:
>>>> If no eeprom is found activate the status of the hdmi node from "disabled"
>>>> to "okay". So with the same algorithm as above,
>>>>
>>>> Those operations will be done in the coredevice_initcall() level. Is this
>>>> correct?
>>>
>>> Sounds like a plan. I'm not sure though if you find your EEPROM at
>>> coredevice_initcall time.
>>>
>>
>> Nope. Accessing device drivers (enabled in the device-tree) is possible
>> in the section: device_initcall() and *NOT* in the coredevice_initcall()
>> time.
>>
>> Anyway I was wondering if looking for a node in the device-tree, it will
>> be possible to change the status of that node.
>>
>> in DTS I have
>>
>> &hdmi {
>> 	status="disabled";
>> }
>>
>> but I need to set the status to "okay" later on the device_initcall() time.
>>
>> Iterating in the device tree using for_each_node_by_name_from() does not
>> show any node like hdmi, but using the same function to look for any
>> "display-timing" section it works.
>
> The node isn't called just "hdmi", that is just the handle, which may
> not even be present in the final DTB if nothing uses it. The nodes name
> is "hdmi at 0120000".
>
> See "arch/arm/boot/dts/imx6qdl.dtsi".
>

Ok, thank you for hints.

 From my dts file:

> &hdmi {
> 	ddc-i2c-bus = <&i2c2>;
> 	status = "disabled";
> };
>

It is disabled by default. It will be enabled later by my 
device_initcall() function.

> &ldb {
> 	#address-cells = <1>;
> 	#size-cells = <0>;
> 	status = "disabled";
>

As the hdmi node.

> 	lvds0: lvds-channel at 0 {
> 		fsl,data-mapping = "spwg";
> 		fsl,data-width = <24>;
> 		status = "disabled";
>

Just for sure it is disabled too!


> 		display-timings {
> 			native-mode = <&am128080n3tz>;

This is fixed. It will be changed during the device_initcall() functions.

> 			/* 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>;
> 			};
> 		};
>
> 	};
> };

The device_initcall() functions is looking for an eeprom on the lvds 
channel, and if found it will matched against the native-mode phandle.
If it is different from the default, a new native-mode will be placed as 
native-mode, and afterall the lvds-channel at 0 and ldb will be flagged in 
status as "okay".

Then the of_device_enable_and_register_by_name("ldb at 020e0008") will be 
called.

In the same way if an eeprom is found on the hdmi connector bus, the 
hdmi status will be changed to "okay".

If there is no display (so no eeprom either) connected on the lvds 
connector, the device_initcall() functions will let all ldb stuff as 
default (i.e. disabled) and it will enable the hdmi section if there is 
a hdmi display (and its eeprom EDID) connected.

The problem is the modeset of framebuffer (.num_modes): this list is 
created from the device-tree sequence and the default does not respect 
the native-mode section. i.e. if I have a 800x480 native mode display 
timing in the device tree as a third option, the fb0.modes will have the 
800x480 in the third place.

There is a quick (and dirty) way of calling the fb0.mode_name inside a 
device_initcall()?

Or I have to use the shell script in init to adapt it correctly?

Regards,
-- 
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