Le guide de débogage de l'écran LCD Allwinner Tina Linux prend en charge MIPI DSI RGB LVDS I8080 SPI et d'autres interfaces, et la carte de développement prend en charge Baiwen.com T113 D1-H Nezha DongshanPI-D1s V853.

image-20221123145359081
image-20221123145359081
image-20221123145359081
image-20221123145359081
image-20221123145359081

1. Vue d'ensemble

  • Objectif de l'écriture
    Ce document présentera la méthode de débogage de l'écran LCD dans le module Display Engine de la plate-forme Sunxi.
  1. Méthodes de débogage LCD et méthodes de débogage.
  2. Écriture du pilote LCD.
  3. Explication de chaque attribut sous le nœud lcd0.
  4. Configuration typique de l'interface LCD.

Champ d'application : réglage des paramètres de l'écran LCD dans la plateforme Sunxi DE1.0/DE2.0.

2 Introduction aux termes associés

Tableau 2-1 : Termes relatifs à l'écran LCD
le terme expliquer
SUNXI Série Allwinner de plates-formes matérielles SoC
Écran LCD Affichage à cristaux liquides
MIPI Interface de processeur pour l'industrie mobile
DSI Afficher l'interface série, afficher l'interface série
I8080 Interface Intel 8080LCD
RVB Il s'agit d'une interface LCD qui envoie des composants RVB sans aucun encodage
LVDS Signalisation différentielle basse tension Une interface LCD caractérisée par une transmission basse tension et différentielle

3 spécifications du circuit intégré

Spécifications liées à l’interface LCD :

  1. Prend en charge le double affichage et l'affichage différentiel. C'est-à-dire que le contenu affiché peut être différent, la résolution d'affichage peut être différente et l'interface de l'écran peut également être différente.

  2. Prend en charge l'interface MIPI-DSI, quantité un. La résolution maximale prise en charge est de 1920x1200@60, la largeur et la hauteur ne doivent pas dépasser 2048 et l'horloge des pixels ne doit pas dépasser 180 MHz.

  3. Prise en charge de l'interface RVB, quantité 2. Parmi eux, l'écran principal prend en charge le RVB666 parallèle et l'écran secondaire prend en charge le RVB888 en parallèle. L'interface RVB parallèle prend en charge une résolution maximale de 1920 x 1200 @ 60, et la largeur et la hauteur ne doivent pas dépasser 2048, comme

Les horloges principales ne dépassant pas 180 MHz sont prises en charge. Ou deux interfaces RVB série, la résolution maximale du RVB série ne dépasse pas 800*480@60

  1. Prend en charge deux interfaces LVDS à double liaison, prenant en charge une résolution maximale de 1920 x 1200 à 60, une largeur et une hauteur ne dépassant pas 2048 et une horloge de pixels ne dépassant pas 180 MHz. Ou 4 connexions LVDS à liaison unique

Port, la résolution prend en charge jusqu'à 1366*768@60.

  1. Deux interfaces I8080. La résolution prend en charge jusqu'à 800*480@60.

  2. L'interface LVDS prend en charge l'affichage simultané des signaux. Toutes les deux interfaces LVDS à liaison unique doivent être connectées au même écran avec la même interface LVDS, et les mêmes données seront envoyées aux deux écrans pour garantir le même signal. donc

Théoriquement, le T509 peut réaliser 4 écrans, dont les deux premiers et les deux derniers peuvent avoir des résolutions différentes. Les résolutions entre les deux doivent être les mêmes et ils doivent être connectés au même écran LCD.

illustrer

Dans un scénario multi-affichage, les interfaces ci-dessus peuvent être librement adaptées, sauf que MIPI-DSI doit être utilisé sur l'écran principal.

Compétence

Une interface LVDS à double liaison comporte un total de 20 lignes. Elle peut être divisée en deux interfaces LVDS à liaison unique, en supposant lvds0 et lvds1. Lors de la sélection d'un lien unique pour l'affichage, lvds0 doit être sélectionné.

4 Présentation du module

4.1 Étapes pour ajouter un pilote d'écran

  1. Pour les versions Linux 4.9 et inférieures, un total de trois emplacements doivent être modifiés (c'est-à-dire les trois premiers éléments ci-dessous). Pour Linux 5.4, quatre emplacements doivent être modifiés. Pour plus de détails, veuillez vous référer à l'emplacement du code source du pilote d'écran. .

• Dépôt de code source Linux.

• Dépôt de code source uboot. Il existe également des pilotes d'affichage et d'écran dans uboot, dont le but est d'afficher le logo.

• Entrepôt de configuration DTS au niveau de la carte. Le but est de configurer certains paramètres de configuration LCD courants via board.dts. Pour Linux 4.9, cette configuration prend effet à la fois sur le noyau et sur uboot. Pour Linux-5.4, veuillez vous référer à l'article suivant.

• Pour Linux5.4, un entrepôt de configuration dts supplémentaire spécifique à uboot au niveau de la carte doit être configuré.

  1. Assurez-vous que la configuration du noyau du framework d'affichage Allwinner est activée, consultez les instructions de configuration de menuconfig.

  2. Préparez à l’avance le matériel et les informations suivants :

• Manuel d'écran. Il décrit principalement les informations de base et les caractéristiques électriques de l'écran, etc., et les demande au fabricant de l'écran.

• Manuel du pilote IC. Il décrit principalement les informations détaillées du circuit intégré d'écran. Voici principalement une explication détaillée de chaque commande, utile pour notre initialisation et personnalisation, demandez-la au fabricant de l'écran.

• Informations de synchronisation d'écran. Veuillez le demander au fabricant de l'écran. Veuillez consulter la description du paramètre de synchronisation d'écran pour plus d'informations.

• Code d'initialisation de l'écran. , veuillez vous renseigner auprès du fabricant de l'écran. Généralement, les écrans DSI et I8080 nécessitent des commandes d'initialisation pour initialiser l'écran.

• Multimètre. Le réglage de l'écran ne peut éviter de mesurer les tensions associées.

  1. Avant d'ajouter le pilote d'écran, vous devez d'abord comprendre le pilote d'écran. Veuillez consulter la description du pilote d'écran.

  2. Localisez le type d'écran grâce aux informations de l'étape 3, puis sélectionnez un pilote d'écran existant du même type comme modèle pour ajouter le pilote d'écran ou le modifier directement.

  3. Modifiez panel.c et panel.h dans le répertoire du pilote d'écran. Ajoutez le pointeur de variable que vous venez d'ajouter strcut_lcd_panel à la variable de structure globale panel_array. Ajout du son strcut lcd_panel dans panel.h

brillant.

  1. Modifiez le Makefile. Ajoutez le pilote d'écran .o qui vient d'être ajouté à disp-objs dans le fichier Makefile au niveau supérieur du répertoire du pilote d'écran LCD.

  2. Modifiez lcd0 dans board.dts. Vous pouvez consulter l'interface RVB, l'interface MIPI-DSI, l'interface I8080 et l'interface LVDS, qui présentent les configurations typiques de diverses interfaces. Description des paramètres matériels, ce chapitre contient toutes les sections lcd0

Cliquez sur les propriétés configurables pour une explication détaillée.

  1. Compilez uboot, le noyau, le package et le programme. Notez que différents SDK ont des méthodes de compilation différentes. Certains SDK ne compilent pas uboot par défaut.
  2. déboguer. Grâce aux méthodes de débogage, nous pouvons dans un premier temps localiser le problème, et il existe des FAQ qui sont également utiles pour le réglage de l'écran.

4.2 Instructions du pilote d'écran

4.2.1 Emplacement du code source du pilote d'écran

Noyau Linux version 3.4 :

linux3-4/drivers/video/sunxi/disp2/disp/lcd/

Noyau Linux version 3.10 :

linux3-10/drivers/video/sunxi/disp2/disp/lcd/

Noyau Linux version 4.9 et supérieure :

linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/

uboot-2014 :

brandy/u-boot-2014.07/drivers/video/sunxi/disp2/disp/lcd

uboot-2018 :

brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd

Configuration au niveau de la carte, où le « modèle de puce » tel que R818 et le « nom de la carte » tel que démo, veuillez le remplacer en fonction de la situation réelle.

périphérique/config/chips/modèle de puce/configs/nom de la carte/board.dts

Configuration au niveau de la carte Uboot utilisée pour Linux5.4 :

périphérique/config/chips/modèle de puce/configs/nom de la carte/uboot-board.dts

Configuration au niveau de la carte noyau utilisée pour Linux5.4 :

périphérique/config/chips/modèle de puce/configs/nom de la carte/linux-5.4/board.dts

4.2.2 Instructions de configuration du menuconfig

Les codes associés à l'écran LCD sont inclus dans le module du pilote disp. Entrez dans le répertoire racine du noyau et exécutez make ARCH=arm menuconfig ou make ARCH=arm64 menuconfig (plateforme 64 bits) pour accéder à l'interface de configuration principale.

nouille. et suivez ces étapes :

Plateformes correspondantes DE1.0 : R6 (linux-3.10), R16 (linux-3.4).

Plateformes correspondantes DE2.0 : sauf R6 et R16.

image-20221129102051729

Figure 4-1 : Diagramme de configuration du menu DE1.0

image-20221129102107009

Figure 4-2 : Diagramme de configuration du menu DE2.0

En prenant R40 comme exemple, le répertoire de configuration spécifique est : Pilotes de périphérique->Support graphique->Support pour les périphériques frame buffer->Support vidéo pour sunxi -> Support du pilote DISP (sunxi-disp2).

4.2.3 Décomposition du pilote d'écran

Dans l'emplacement du code source du pilote d'écran, il est principalement divisé en quatre types de fichiers :

  1. panel.c et panel.h, lorsque l'utilisateur ajoute un nouveau pilote d'écran, ces deux fichiers doivent être modifiés. La variable de structure d'écran doit être ajoutée à la variable de structure globale panel_array.

  2. lcd_source.c et lcd_source.h, ces deux fichiers implémentent les interfaces de fonction utilisées par le pilote d'écran, telles que l'interrupteur d'alimentation, gpio, l'interface de lecture et d'écriture dsi, etc. Les utilisateurs n'ont pas besoin de les modifier, ils n'ont qu'à les utiliser .

  3. pilote d'écran. En plus des fichiers sources mentionnés ci-dessus, généralement un fichier c et un fichier h représentent un pilote d'écran.

  4. Au niveau supérieur de l'emplacement du code source du pilote d'écran, se trouve un fichier Makefile que l'utilisateur doit modifier.

Nous pouvons ouvrir drivers/video/fbdev/sunxi/disp2/disp/lcd/default_panel.c comme exemple de pilote d'écran à la fin du fichier

struct __lcd_panel default_panel = {
    /* panel driver name, must mach the lcd_drv_name in board.dts */
    .name = "default_lcd",
        .func = {
        .cfg_panel_info = LCD_cfg_panel_info,
        .cfg_open_flow = LCD_open_flow,
        .cfg_close_flow = LCD_close_flow,
        }
    ,
};

Le nom de membre de la variable globale default_panel doit être cohérent avec lcd_driver_name. Cela dépend de la capacité du pilote à trouver le fichier spécifié.

Vient ensuite l'initialisation du membre func, où trois fonctions de rappel sont principalement implémentées. LCD_cfg_panel_info, LCD_open_flow et LCD_close_flow.

Le processus d'allumage et d'extinction de l'écran est le processus d'allumage et d'extinction de l'écran, qui est la séquence de mise sous tension et la séquence de mise hors tension dans le manuel de l'écran ou le manuel du pilote IC.

Le processus opérationnel de commutation d’écran est illustré dans la figure ci-dessous.

Parmi elles, LCD_open_flow et LCD_close_flow sont appelées fonctions de processus de commutation d'écran, et les fonctions dans la boîte, telles que LCD_power_on, sont appelées fonctions d'étape de commutation d'écran.

Pour les écrans LCD ne nécessitant pas d'opérations d'initialisation, comme les écrans lvds, les écrans RGB, etc., les fonctions LCD_panel_init et LCD_panel_exit peuvent être vides.

image-20221129102353374

Figure 4-3 : Processus de commutation de l'écran LCD

Fonction : LCD_open_flow

Fonction : La fonction LCD_open_flow ne sera appelée qu'une seule fois lors de l'initialisation du système. Exécuter chaque LCD_OPEN_FUNC signifie enregistrer la fonction d'étape d'ouverture d'écran correspondante. Enregistrez-vous d'abord et exécutez-le en premier, mais il n'est pas exécuté immédiatement.

Exécutez la fonction d’étape d’ouverture d’écran.

prototype:

static s32 LCD_open_flow(u32 sel)

Les fonctions couramment utilisées sont :

static __s32 LCD_open_flow(__u32 sel)
{
    LCD_OPEN_FUNC(sel, LCD_power_on,10);
    LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
    LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 100);
    LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
    return 0;
}

Comme ci-dessus, appeler LCD_OPEN_FUNC quatre fois enregistre quatre fonctions de rappel, correspondant à quatre processus d'ouverture d'écran. Enregistrez d'abord et exécutez en premier. En fait, c'est à l'utilisateur de décider combien de fonctions enregistrer, à condition que cela soit raisonnable.

  1. LCD_power_on signifie allumer l'alimentation de l'écran LCD, puis la retarder de 10 ms ; cette étape est généralement utilisée pour allumer l'alimentation électrique associée à l'écran LCD et les broches associées telles que la broche de réinitialisation. Ici, la description de la fonction de contrôle de puissance et le contrôle des broches sont généralement utilisés.

Description de la fonction à utiliser.

  1. LCD_panel_init est l'écran d'initialisation, puis retardé de 50 ms ; pour les écrans qui ne nécessitent pas d'initialisation, cette étape peut être omise. Cette fonction est généralement utilisée pour envoyer des commandes d'initialisation à l'écran pour l'initialisation de l'écran. S'il s'agit d'un écran DSI, regardez la phase DSI

Concernant la description de la fonction, s'il s'agit d'un écran I8080, utilisez la description de la fonction de l'interface I8080. S'il s'agit d'autres situations telles que i2c ou spi, vous pouvez utiliser l'initialisation de l'interface série iic/spi, ou vous pouvez utiliser GPIO pour simuler.

  1. sunxi_lcd_tcon_enable active TCON et retarde de 100 ms ; cette étape est fixe et signifie commencer à envoyer des signaux d'image.

  2. LCD_bl_open allume le rétroéclairage, puis retarde 0 ms. Allumez le rétroéclairage après avoir effectué les trois premières étapes afin de ne pas voir de scintillement. Veuillez consulter la description de la fonction de contrôle du rétroéclairage pour les fonctions généralement utilisées ici.

Comme indiqué ci-dessous, il s'agit d'un diagramme de séquence de mise sous tension typique dans le manuel de l'écran. Lorsque nous écrivons le pilote d'écran, nous devons également faire attention au délai.

image-20221129102545133

Figure 4-4 : mise sous tension

Fonction : LCD_OPEN_FUNC

Fonction : Enregistrez la fonction d'étape d'ouverture d'écran dans le processus d'ouverture d'écran. N'oubliez pas qu'il s'agit d'un enregistrement, pas d'une exécution !

prototype:

void LCD_OPEN_FUNC(__u32 sel, LCD_FUNC func, __u32 delay)

Description du paramètre :

func est un pointeur de fonction, son type est : void (*LCD_FUNC) (__u32 sel). Les fonctions définies par l'utilisateur doivent également utiliser une forme unifiée. Par exemple:

void user_defined_func(__u32 sel)
{
    //do something
}

delay est le temps de retard après l'exécution de cette étape, l'unité de temps est la milliseconde.

Le deuxième paramètre de LCD_OPEN_FUNC est la durée du délai des deux étapes avant et après, l'unité est en ms. Veuillez noter que la valeur ici doit être renseignée conformément aux réglementations du manuel de l'écran. Le remplissage aléatoire peut provoquer une initialisation anormale de l'écran ou le temps de commutation de l'écran expirera.

long, affectant l’expérience utilisateur.

Correspondant à LCD_open_flow est LCD_close_flow, qui est utilisé pour enregistrer la fonction de fermeture de l'écran. Utilisez LCD_CLOSE_FUNC pour enregistrer la fonction. Enregistrez-vous d'abord et exécutez d'abord. Ici, la fonction de rappel est uniquement enregistrée et non exécutée immédiatement.

D'ACCORD.

static s32 LCD_close_flow(u32 sel)
{
    /* close lcd backlight, and delay 0ms */
    LCD_CLOSE_FUNC(sel, LCD_bl_close, 0);
    /* close lcd controller, and delay 0ms */
    LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 50);
    /* open lcd power, than delay 200ms */
    LCD_CLOSE_FUNC(sel, LCD_panel_exit, 100);
    /* close lcd power, and delay 500ms */
    LCD_CLOSE_FUNC(sel, LCD_power_off, 0);
    return 0;
}
  1. Éteignez d'abord le rétroéclairage, afin que l'utilisateur ne voie pas le processus de scintillement pendant tout le processus d'arrêt de l'écran.

  2. Il est nécessaire de fermer TCON, ce qui signifie arrêter l'envoi de données. Retardez encore 50 ms.

  3. Exécutez le code d'arrêt de l'écran et retardez-le pendant 200 ms (cette étape peut être omise pour les écrans qui ne nécessitent pas d'initialisation).

  4. Enfin, coupez l'alimentation et retardez 0 ms.

La figure ci-dessous est un chronogramme typique de coupure d'écran.

image-20221129102917140

Figure 4-5 : mise hors tension

Fonction : LCD_cfg_panel_info

Fonction : paramètres étendus TCON configurés, tels que la fonction gamma et la fonction de mappage des couleurs.

prototype:

static void LCD_cfg_panel_info(__panel_extend_para_t * info)

Les paramètres étendus de TCON ne peuvent être configurés que dans le fichier écran. Pour la définition des paramètres, voir les paramètres liés à l'effet d'affichage.

Si une correction gamma ou un mappage de couleurs est requis, définissez le paramètre d'activation du module correspondant sur 1 dans board.dts, lcd_gamma_en, lcd_cmap_en, et remplissez 3 tables de coefficients, lcd_gamma_tbl,

lcd_cmap_tbl, la partie code est affichée ci-dessous. Remarque : gamma, le modèle fournit 18 valeurs de points d'inflexion, puis interpole toutes les valeurs (255). Si vous estimez qu’il n’est pas assez détaillé, vous pouvez l’ajouter au tableau correspondant.

enfant. La taille de cmap_tbl est fixe et la taille de la table ne peut être ni réduite ni augmentée.

L'entrée finale de la table gamma générée est composée de trois valeurs gamma, rgb, chacune occupant 8 bits. Dans le modèle actuellement fourni, les trois valeurs gamma sont les mêmes.

static void LCD_cfg_panel_info(struct panel_extend_para *info)
{
    u32 i = 0, j = 0;
    u32 items;
    u8 lcd_gamma_tbl[][2] = {
        /* {input value, corrected value} */
        {0, 0},
        {15, 15},
        {30, 30},
        {45, 45},
        {60, 60},
        {75, 75},
        {90, 90},
        {105, 105},
        {120, 120},
        {135, 135},
        {150, 150},
        {165, 165},
        {180, 180},
        {195, 195},
        {210, 210},
        {225, 225},
        {240, 240},
        {255, 255},
    };
    u32 lcd_cmap_tbl[2][3][4] = {
    {
        {LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
        {LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
        {LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
        },
        {
        {LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
        {LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
        {LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
        },
    };
    items = sizeof(lcd_gamma_tbl) / 2;
    for (i = 0; i < items - 1; i++) {
    	u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
        for (j = 0; j < num; j++) {
            u32 value = 0;
            value =
            lcd_gamma_tbl[i][1] +
            ((lcd_gamma_tbl[i + 1][1] -
            lcd_gamma_tbl[i][1]) * j) / num;
            info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
            (value << 16) + (value << 8) + value;
        }
    }
    info->lcd_gamma_tbl[255] =
        (lcd_gamma_tbl[items - 1][1] << 16) +
        (lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
    memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
}
4.2.4 Description de la fonction de temporisation

Nom : sunxi_lcd_delay_ms / sunxi_lcd_delay_us

Fonction : fonction de retard, respectivement niveau milliseconde/niveau microseconde.

原型:s32 sunxi_lcd_delay_ms(u32 ms) / s32 sunxi_lcd_delay_us(u32 us)

4.2.5 Description de la fonction d'activation des données d'image

Nom : sunxi_lcd_tcon_enable / sunxi_lcd_tcon_disable

Fonction : allumez le contrôleur LCD et commencez à rafraîchir l'écran LCD. Éteignez le contrôleur LCD et arrêtez de rafraîchir les données.

Exemple : void sunxi_lcd_tcon_enable (u32 screen_id)

annuler sunxi_lcd_tcon_disable (u32 screen_id)

4.2.6 Description de la fonction de contrôle du rétroéclairage

Nom : sunxi_lcd_backlight_enable / sunxi_lcd_backlight_disable

Fonction : allumer/éteindre le rétroéclairage, en utilisant le gpio configuré par lcd_bl dans board.dts. Voir lcd_bl_en.

Exemple : void sunxi_lcd_backlight_enable (u32 screen_id)

annuler sunxi_lcd_backlight_disable (u32 screen_id)

Nom : sunxi_lcd_pwm_enable / sunxi_lcd_pwm_disable

Fonction : allumer/éteindre le contrôleur PWM. Lorsqu'il est allumé, le PWM émettra la forme d'onde PWM. Correspondant au pwm correspondant à lcd_pwm_ch.

Nom : s32 sunxi_lcd_pwm_enable (u32 screen_id)

s32 sunxi_lcd_pwm_disable (u32 screen_id)

4.2.7 Description de la fonction de contrôle de puissance

Nom : sunxi_lcd_power_enable / sunxi_lcd_power_disable

Fonction : allumer/éteindre l'alimentation Lcd, l'opération est lcd_power/lcd_power1/lcd_power2 dans board.dts (pwr_id identifie l'indice de puissance).

Exemple : void sunxi_lcd_power_enable (u32 screen_id, u32 pwr_id)

void sunxi_lcd_power_disable (u32 screen_id, u32 pwr_id)

  1. pwr_id = 0 : correspond à lcd_power dans board.dts.
  2. pwr_id = 1 : correspond à lcd_power1 dans board.dts.
  3. pwr_id = 2 : correspond à lcd_power2 dans board.dts.
  4. pwr_id = 3 : correspond à lcd_power3 dans board.dts.

Fonction : sunxi_lcd_pin_cfg

Fonction : configurer l'écran LCD IO.

Nom : s32 sunxi_lcd_pin_cfg (u32 screen_id, u32 bon)

Description : Configurez les données/clk et les autres broches de l'écran LCD, correspondant à lcdd0-lcdd23/lcddclk/lcdde/lcdhsync/lcdvsync dans board.dts.

Puisque dsi est une broche dédiée, l'écran de l'interface dsi n'a pas besoin de configurer cet ensemble de broches dans board.dts, mais les broches correspondantes seront également activées et désactivées dans cette interface de fonction.

Bon : 1 : signifie activé, 0 : signifie configuré pour désactiver l'état.

4.2.8 Description des fonctions liées au DSI

La plupart des écrans MIPI DSI doivent être initialisés, en utilisant le mode LP du canal DSI-D0 pour l'initialisation. Les fonctions d'interface fournies sont décrites comme suit :

Nom : sunxi_lcd_dsi_clk_enable / sunxi_lcd_dsi_clk_disble

Fonction : Utilisé uniquement par l'écran d'interface dsi. Active/désactive le signal d'horloge clk à grande vitesse émis par dsi. Il doit être appelé lors de l'initialisation.

Nom : s32 sunxi_lcd_dsi_clk_enable (u32 scree_id)

s32 sunxi_lcd_dsi_clk_disable (u32 écran_id)

Fonction : sunxi_lcd_dsi_dcs_wr

Fonction : opération d'écriture DCS sur l'écran.

Nom :__s32 sunxi_lcd_dsi_dcs_wr(__u32 sel,__u8 cmd,__u8* para_p,__u32 para_num)

Description du paramètre :

• cmd : dcs écrit le contenu de la commande.

• para_p : paramètre adresse de départ de la commande dcs write.

• para_num : Le nombre de paramètres pour la commande dcs write, en octets.

Fonction : sunxi_lcd_dsi_dcs_wr_2para

Fonction : opération d'écriture dcs sur l'écran. Cette commande prend deux paramètres.

Nom :__s32 sunxi_lcd_dsi_dcs_wr_2para(__u32 sel,__u8 cmd,__u8 para1,__u8 para2)

Description du paramètre :

• cmd : dcs écrit le contenu de la commande.

• para1 : Le contenu du premier paramètre de la commande dcs write.

• para2 : Le contenu du deuxième paramètre de la commande dcs write.

sunxi_dsi_dcs_wr_0para,sunxi_dsi_dcs_wr_1para,sunxi_dsi_dcs_wr_3para,sunxi_dsi_dcs_wr_4para,

La définition de sunxi_dsi_dcs_wr_5para est similaire à celle de dsi_dcs_wr_2para, la différence est le nombre de paramètres.

Fonction : sunxi_lcd_dsi_dcs_read

Fonction : opération de lecture DSI.

Exemple : s32 sunxi_lcd_dsi_dcs_read (u32 sel, u8 cmd, résultat u8, u32 num_p)

Description du paramètre :

• sel, affiche l'identifiant.

• cmd, le registre à lire.

• résultat, un tableau permettant de stocker l'interface de lecture. L'utilisateur doit s'assurer qu'il y a suffisamment d'espace pour sauvegarder l'interface de lecture.

• num_p, le pointeur permet de stocker le nombre d'octets à lire, et l'utilisateur doit s'assurer qu'il ne s'agit pas d'un pointeur nul.

4.2.9 Description des fonctions de l'interface I8080

Le pilote d'affichage fournit 5 fonctions d'interface à utiliser. comme suit:

Fonction : sunxi_lcd_cpu_write

Fonction : définissez le registre spécifié de l'écran du processeur sur la valeur spécifiée.

Exemple : void sunxi_lcd_cpu_write (__u32 sel, __u32 index, __u32 data)

Le contenu de la fonction est :

Void sunxi_lcd_cpu_write(__u32 sel, __u32 index, __u32 data)
{
    sunxi_lcd_cpu_write_index(sel, index);
    sunxi_lcd_cpu_wirte_data(sel, data);
}

Deux opérations d'écriture sur le bus 8080 sont implémentées.

sunxi_lcd_cpu_write_index implémente la première opération d'écriture.À ce moment, la broche PIN RS (A1) est de niveau bas et le contenu des données sur les données du bus est la valeur de l'index du paramètre.

Sunxi_lcd_cpu_wirte_data implémente la deuxième opération d'écriture.À ce moment, la broche PIN RS (A1) est de niveau haut et le contenu des données sur les données du bus est la valeur des données de paramètre.

Fonction : sunxi_lcd_cpu_write_index

Fonction : définissez l'écran du processeur sur le registre spécifié.

prototype:

void sunxi_lcd_cpu_write_index(__u32 sel,__u32 index)

Voir sunxi_lcd_cpu_write pour des instructions spécifiques.

Fonction : sunxi_lcd_cpu_write_data

Fonction : définissez la valeur du registre d'écran du processeur sur la valeur spécifiée.

prototype:

void Sunxi_lcd_cpu_write_data(__u32 sel, __u32 data);

Fonction : tcon0_cpu_rd_24b_data

Fonction : opération de lecture.

prototype:

s32 tcon0_cpu_rd_24b_data(u32 sel, u32 index, u32 *data, u32 size)

Description du paramètre :

• sel : afficher l'identifiant.

• index : le registre à lire.

• data : utilisé pour stocker le pointeur de tableau de l'interface de lecture. L'utilisateur doit s'assurer qu'il dispose de suffisamment d'espace pour stocker les données.

• size : Nombre d'octets à lire.

4.2.10 Description de la fonction de contrôle des broches

Fonction : sunxi_lcd_gpio_set_value

Fonction : la broche LCD_GPIO PIN produit un niveau haut ou bas.

Exemple : s32 sunxi_lcd_gpio_set_value (u32 screen_id, u32 io_index, u32 value)

Description du paramètre :

• io_index = 0 : Correspond à lcd_gpio_0 dans board.dts.

• io_index = 1 : correspond à lcd_gpio_1 dans board.dts.

• io_index = 2 : Correspond à lcd_gpio_2 dans board.dts.

• io_index = 3 : Correspond à lcd_gpio_3 dans board.dts.

• valeur = 0 : correspond au niveau bas de la sortie IO.

• Valeur = 1 : correspond au niveau haut de la sortie IO.

Utilisé uniquement lorsque le GPIO est défini comme sortie.

Fonction : sunxi_lcd_gpio_set_direction

Fonction : définissez la broche LCD_GPIO PIN en mode d'entrée ou de sortie.

prototype:

s32 sunxi_lcd_gpio_set_direction(u32 screen_id, u32 io_index, u32 direction);

Description du paramètre :

• io_index = 0 : Correspond à lcd_gpio_0 dans board.dts.

• io_index = 1 : correspond à lcd_gpio_1 dans board.dts.

• io_index = 2 : Correspond à lcd_gpio_2 dans board.dts.

• io_index = 3 : Correspond à lcd_gpio_3 dans board.dts.

• direction = 0 : L'E/S correspondante est mise à l'entrée.

• direction = 1 : l'E/S correspondante est mise en sortie.

Certains écrans nécessitent d'être initialisés. Dans la fonction étape d'ouverture d'écran, correspondant à la fonction LCD_panel_init, plusieurs méthodes sont proposées pour initialiser l'écran.

Pour l'écran DSI, il est initialisé via le canal DSI-D0. Pour l'écran CPU, il est initialisé via le bus 8080 et utilise LCDIO (PD, PH). Dans cette méthode d'initialisation, les bits des broches de son bus

La définition des paramètres est cohérente avec l'écran du processeur.

Les interfaces suivantes sont définies et implémentées dans lcd_source.c et lcd_source.h dont les chemins sont mentionnés dans la décomposition du pilote d'écran.

4.2.11 Initialisation à l'aide de l'interface série iic/spi

L'accès du périphérique iic/spi à l'interface série doit être enregistré dans le pilote d'écran.

Utilisez le spi matériel pour filtrer ou transférer l'IC pour l'initialiser, comme indiqué dans l'extrait de code suivant.

Appelez d'abord la fonction spi_init pour initialiser le matériel spi. La fonction spi_init peut être divisée en plusieurs étapes. Tout d'abord, obtenez le maître ; en fonction de la connexion matérielle réelle, sélectionnez spi (spi1 est sélectionné dans le code). Si cela

Si l'étape renvoie une erreur indiquant que spi n'est pas configuré correctement, veuillez contacter la personne en charge du pilote spi. La deuxième étape consiste à définir le périphérique spi, qui inclut la vitesse maximale, le mode de transmission spi et le nombre de bits contenus dans chaque mot. Enfin, appelez spi_setup pour terminer

La relation entre le maître et l'appareil.

comm_out est un exemple de transfert spi, et le cœur est la fonction spi_sync_transfer.

static int spi_init(void)
{
    int ret = -1;
    struct spi_master *master;
    master = spi_busnum_to_master(1);
    if (!master) {
        lcd_fb_wrn("fail to get master\n");
        goto OUT
    }
    spi_device = spi_alloc_device(master);
    if (!spi_device) {
        lcd_fb_wrn("fail to get spi device\n");
        goto OUT;
    }
spi_device->bits_per_word = 8;
    spi_device->max_speed_hz = 60000000; /*50MHz*/
    spi_device->mode = SPI_MODE_0;
    ret = spi_setup(spi_device);
    if (ret) {
        lcd_fb_wrn("Faile to setup spi\n");
        goto FREE;
    }
	lcd_fb_inf("Init spi1:bits_per_word:%d max_speed_hz:%d mode:%d\n",
        spi_device->bits_per_word, spi_device->max_speed_hz,
        spi_device->mode);
	ret = 0;
	goto OUT;
FREE:
    spi_master_put(master);
    kfree(spi_device);
    spi_device = NULL;
OUT:
    return ret;
}
static int comm_out(unsigned int sel, unsigned char cmd)
{
    struct spi_transfer t;
    if (!spi_device)
    	return -1;
    DC(sel, 0);
    memset(&t, 0, sizeof(struct spi_transfer));
    t.tx_buf = &cmd;
    t.len = 1;
    t.bits_per_word = 8;
    t.speed_hz = 24000000;
    return spi_sync_transfer(spi_device, &t, 1);
}

Utilisez le matériel i2c pour initialiser l'écran LCD et le circuit intégré de l'adaptateur. La fonction principale pour initialiser le matériel i2c est i2c_add_driver, et ce que vous devez faire est d'initialiser sa structure de paramètres i2c_driver.

it66121_id contient le nom de l'appareil et l'index du bus i2c (i2c0, i2c1...).

it66121_i2c_probe Si vous pouvez accéder à cette fonction, vous pouvez commencer à utiliser i2c. Dans le segment de code, seul le paramètre cilent nécessaire ultérieurement est affecté à une variable de pointeur globale.

it66121_match, c'est la table de correspondance de dts. Puisque vous ajoutez un pilote à disp2, la table de correspondance ici est la table de correspondance de disp2. Cette table indique si i2c peut être utilisé. Veuillez faire attention.

Remplissez le mauvais formulaire.
La fonction tv_i2c_detect est ici très critique. Cette fonction est appelée plus tôt que la fonction de sonde. Ce n'est qu'après son appel réussi que vous pouvez commencer à utiliser i2c. L'appel de strlcpy signifie le succès.

normal_i2c est la liste d'adresses du périphérique esclave, renseignée avec l'adresse du périphérique esclave de l'écran LCD ou du circuit intégré de transfert et l'index i2c.

La possibilité de commencer à utiliser I2C dépend de l'appel ou non de la fonction de sonde.

L'utilisation de i2c_smbus_write_byte_data ou i2c_smbus_read_byte_data pour lire et écrire peut satisfaire la plupart des scénarios.

#define IT66121_SLAVE_ADDR 0x4c
#define IT66121_I2C_ID 0
static const struct i2c_device_id it66121_id[] = {
    { "IT66121", IT66121_I2C_ID },
    { /* END OF LIST */ }
};
MODULE_DEVICE_TABLE(i2c, it66121_id);
static int it66121_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    this_client = client;
    return 0;
}
static const struct of_device_id it66121_match[] = {
    {.compatible = "allwinner,sun8iw10p1-disp",},
    {.compatible = "allwinner,sun50i-disp",},
    {.compatible = "allwinner,sunxi-disp",},
    {},
};
static int tv_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
{
    const char *type_name = "IT66121";
    if (IT66121_I2C_ID == client->adapter->nr) {
    	strlcpy(info->type, type_name, 20);
    } else
		pr_warn("%s:%d wrong i2c id:%d, expect id is :%d\n", __func__, __LINE__,
    		client->adapter->nr, IT66121_I2C_ID);
    return 0;
}
static unsigned short normal_i2c[] = {IT66121_SLAVE_ADDR, I2C_CLIENT_END};
static struct i2c_driver it66121_i2c_driver = {
    .class = I2C_CLASS_HWMON,
    .id_table = it66121_id,
    .probe = it66121_i2c_probe,
    .remove = it66121_i2c_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = "IT66121",
        .of_match_table = it66121_match,
    },
    .detect = tv_i2c_detect,
    .address_list = normal_i2c,
};
static void LCD_panel_init(u32 sel)
{
    int ret = -1;
    ret = i2c_add_driver(&it66121_i2c_driver);
    if (ret) {
        pr_warn("Add it66121_i2c_driver fail!\n");
        return;
    }
    //start init chip with i2c
}
void it6612_twi_write_byte(it6612_reg_set* reg)
{
    u8 rdata = 0;
    u8 tmp = 0;
    rdata = i2c_smbus_read_byte_data(this_client, reg->offset);
    tmp = (rdata & (~reg->mask))|(reg->mask&reg->value);
    i2c_smbus_write_byte_data(this_client, reg->offset, tmp);
}
4.2.12 Précautions liées au pilote d'écran U-boot

Les étapes d'écriture des pilotes d'écran dans U-boot sont les mêmes que celles du noyau, et les fichiers de chemin de code sont organisés de la même manière. Voici les éléments auxquels vous devez prêter attention.

1. Afin d'accélérer la vitesse d'affichage de U-boot, un appel asynchrone est adopté entre plusieurs fonctions qui ouvrent l'écran. Le principe est d'utiliser l'interruption du minuteur pour appeler régulièrement la fonction d'ouverture de l'écran. Par conséquent, dans ce cas, le Le framework bootGUI est chargé et

Cela ne signifie pas que l'ouverture de l'écran est terminée, mais lorsque vous voyez l'écran LCD ouvert, l'impression est terminée.

Suggestion : Afin de profiter des avantages des appels asynchrones, veuillez spécifier le délai requis lors de l'enregistrement du rappel. Par exemple, le délai suivant de 10 ms utilise un rappel asynchrone par minuterie. Pendant ce temps de 10 ms, uboot

Vous pouvez faire d'autres choses pour atteindre l'objectif des appels asynchrones.

LCD_OPEN_FUNC(sel, LCD_power_on,10);

2. Les fonctions sunxi_lcd_power_enable et sunxi_lcd_pin_cfg ne peuvent pas être appelées en dehors de LCD_power_on, sinon uboot sera anormal.

À proprement parler, il ne peut être appelé que dans la première fonction de rappel enregistrée avec LCD_OPEN_FUNC.

4.3 Interface RVB

4.3.1 Aperçu

Ce qui suit présente les exemples RVB et de configuration de la plate-forme Allwinner. Quant à l'explication détaillée de chaque attribut ci-dessous lcd0, veuillez consulter la description des paramètres matériels.

L'interface RGB est également appelée interface HV (Synchronisation horizontale et Synchronisation verticale) sur la plateforme Allwinner.

Pour l'initialisation de l'écran RVB :

Certains écrans LCD prennent en charge des fonctions avancées telles que le gamma, les paramètres de format de pixel, etc., mais le protocole RVB lui-même ne prend pas en charge la transmission autre que les données d'image, de sorte que l'écran LCD ne peut pas être configuré via les broches RVB.

Ainsi, si vous obtenez un écran d'interface RVB, soit vous n'avez pas besoin d'une commande d'initialisation, soit l'écran fournira des broches supplémentaires à configurer par le SoC, telles que SPI et I2C.

4.3.2 Broches de l'interface RVB

image-20221129104718608

Figure 4-6 : broches RVB

Pour les broches et fonctions spécifiques du SoC (fonctions de multiplexage des broches) des broches ci-dessus, veuillez vous référer au tableau pin mux. Les noms des fonctions de multiplexage des broches commencent généralement par "LCDX_", où X est un nombre.

Le nombre de broches de données n'est pas nécessairement de 24. RVB est subdivisé en plusieurs interfaces, qui sont sélectionnées en définissant lcd_hv_if.

Tableau 4-1 : Classification des interfaces RVB
largeur de bits cycle d'horloge Compter la quantité et le format de couleur
24 bits 1 cycle 16,7 millions de couleurs, RVB888
18 bits 1 cycle 262 000 couleurs, RVB666
16 bits 1 cycle 65 000 couleurs, RVB565
6 bits 3 cycles 262 000 couleurs, RVB666
6 bits 3 cycles 65 000 couleurs, RVB565

illustrer

La signification du nombre de cycles d'horloge : cela signifie le nombre de cycles d'horloge nécessaires pour qu'un pixel soit envoyé.

Lorsque le cycle d'horloge est 1, nous appelons cette interface RVB une interface parallèle. Dans d'autres cas, il s'agit d'une interface série. Le principe plus général est que toute interface qui nécessite plusieurs cycles d'horloge pour envoyer un pixel est série.

interface.

Comment juger si la largeur de bits de 24 bits est prise en charge ? Le moyen le plus simple est de compter le nombre de broches de données dans la table pinmux. S'il y a 24 broches, il prend en charge 24 bits. S'il n'y a que 18 broches, il prend en charge 18 bits.

Connexion matérielle

Pour les interfaces RVB parallèles, lorsque la largeur de bits est inférieure à 24, la connexion matérielle doit choisir de connecter les bits élevés dans chaque composant et d'abandonner les bits faibles. La raison en est de perdre un plus petit nombre de couleurs.

Pour l'interface série RVB, la connexion matérielle peut faire référence aux colonnes de synchronisation RVB dans le schéma de configuration des broches RVB et I8080.

L'interface RVB dispose de deux méthodes de synchronisation. Selon votre expérience, essayez d'utiliser la deuxième méthode. Veuillez vous assurer que la broche DE est connectée au matériel.

  1. Hsync+Vsync
  2. DE (Activation des données)
4.3.3 Exemple de configuration d'interface RVB parallèle

Lorsque nous configurons l'interface RVB parallèle, il n'est pas nécessaire de faire la distinction entre 24 bits, 18 bits et 16 bits dans la configuration. Pour la largeur de bit maximale, reportez-vous au tableau pin mux. Si l'écran LCD lui-même prend en charge un largeur de bits plus large que celle prise en charge par le SoC

Si la largeur de bit est petite, vous ne pouvez bien sûr choisir que la plus petite.

Parce qu'elle ne nécessite pas d'initialisation, il y a très peu de problèmes avec l'interface RVB. Concentrez-vous sur la rationalité du timing de l'écran LCD, c'est-à-dire la rationalité des attributs de lcd_ht, lcd_hspw, lcd_hbp, lcd_vt, lcd_vspw et lcd_vbp.

sexe.

Ce qui suit est un exemple typique de configuration d'interface RVB parallèle board.dts, dans lequel des lignes vides sont utilisées pour diviser la configuration en plusieurs parties.

  1. La première partie détermine si la configuration est utilisée et quel pilote d'écran utiliser. lcd_driver_name détermine quel pilote d'écran utiliser pour l'initialisation. Voici default_lcd, qui est défini pour les paramètres qui ne nécessitent pas d'initialisation.

Écran RVB

  1. La deuxième partie détermine si la configuration suivante est une configuration RVB parallèle.

  2. La troisième partie détermine le timing de transmission du module LCD dans le SoC. Veuillez vérifier la description du paramètre de timing d'écran.

  3. La quatrième partie détermine le rétroéclairage (pwm et lcd_bl_en). Veuillez consulter les paramètres liés au rétroéclairage.

  4. La cinquième partie est la configuration de la partie effet d'affichage. S'il ne s'agit pas de RVB 24 bits, vous devez généralement définir lcd_frm.

  5. La sixième partie concerne l'alimentation et la configuration des broches. L'utilisation de RGB666 ou RGB888 doit être décidée en fonction de la table pinmux réelle. Si la puce ne dispose que de 18 données RVB, elle ne peut être que RVB18. Veuillez consulter l'alimentation et les broches

paramètre.

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "default_lcd";
    /* part 2 */
    lcd_if = <0>;
    lcd_hv_if = <0>;
    /* part 3 */
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_x = <800>;
    lcd_y = <480>;
    lcd_dclk_freq = <33>;
    lcd_hbp = <46>;
    lcd_ht = <1055>;
    lcd_hspw = <0>;
    lcd_vbp = <23>;
    lcd_vt = <525>;
    lcd_vspw = <0>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <10000>;
    lcd_pwm_pol = <1>;
    lcd_bl_en = <&pio PD 27 1 0 3 1>;
    lcd_bright_curve_en = <0>;
    /* part 5 */
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    /* part 6 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    pinctrl-0 = <&rgb24_pins_a>;
    pinctrl-1 = <&rgb24_pins_b>;
};

4.3.4 Configuration typique de l'interface série RVB

Le RVB série est relatif au RVB parallèle. Cela ne signifie pas qu'il utilise une seule ligne pour envoyer des données. Tant que plusieurs cycles d'horloge peuvent être utilisés pour envoyer les données d'un pixel, alors une telle interface RVB est du RVB série.

Tout comme l'interface RVB parallèle, l'interface RVB série spécifique n'est pas requise et ne peut pas être reflétée dans la configuration. Il suffit de connecter correctement le matériel.

Ce qui suit est un exemple typique de configuration d'une carte d'interface RVB série.dts. Il ne comporte que 8 broches de données. Des lignes vides sont utilisées pour diviser la configuration en plusieurs parties.

  1. La première partie détermine si la configuration est utilisée et quel pilote d'écran utiliser. lcd_driver_name détermine quel pilote d'écran utiliser pour l'initialisation.

  2. La division 2 détermine que la configuration suivante est une configuration RVB série.

  3. La troisième partie détermine le timing de transmission du module LCD dans le SoC. Veuillez vérifier la description du paramètre de timing d'écran.

Conseils Ce qu'il
faut noter ici, c'est que pour cette interface, le SoC nécessite un total de trois cycles pour envoyer un pixel, donc lorsque nous configurons le timing, nous devons respecter lcd_dclk_freq 3=lcd_ht lcd_vt 60 , ou

lcd_dclk_freq=lcd_ht 3 lcd_vt 60 est soit 3 fois lcd_ht, soit 3 fois lcd_dclk_freq.

  1. La quatrième partie détermine le rétroéclairage. C'est pwm et lcd_bl_en. Veuillez consulter les paramètres liés au rétroéclairage

  2. La cinquième partie concerne les paramètres des effets d'affichage.

  3. Partie 6 : Définition des broches et des alimentations. Veuillez consulter les paramètres d'alimentation et de broches.

illustrer

Le circuit intégré du pilote LCD dans l'exemple ci-dessous est stv7789v, qui doit être initialisé. Le protocole d'interface initialisé est SPI, il existe donc plusieurs autres configurations de broches SPI. GPIO est utilisé dans le pilote pour simuler le protocole SPI, voici donc les configurations

fonction gpio.

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "st7789v";
    /* part 2 */
    lcd_if = <0>;
    lcd_hv_if = <8>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <320>;
    lcd_width = <108>;
    lcd_height = <64>;
    lcd_dclk_freq = <19>;
    lcd_hbp = <120>;
    ;10 + 20 + 10 + 240*3 = 760 real set 1000
    lcd_ht = <850>;
    lcd_hspw = <2>;
    lcd_vbp = <13>;
    lcd_vt = <373>;
    lcd_vspw = <2>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PB 1 1 0 3 1>;
    lcd_bright_curve_en = <1>;
    /* part 5 */
    lcd_frm = <1>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_hv_srgb_seq = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_rb_swap = <0>;
    /* part 6 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    /*reset */
    lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
    /* cs */
    lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
    /*sda */
    lcd_gpio_2 = <&pio PD 13 1 0 3 0>;
    /*sck */
    lcd_gpio_3 = <&pio PD 12 1 0 3 0>;
    pinctrl-0 = <&rgb8_pins_a>;
    pinctrl-1 = <&rgb8_pins_b>;
};

4.4 Interface MIPI-DSI

4.4.1 Aperçu

MIPI-DSI, Mobile Industry Processor Interface Display Serial Interface, est l'interface série d'affichage de l'interface de processeur industriel mobile.

Les utilisateurs doivent savoir :

  1. Le mode commande, similaire à l'interface MPU, nécessite GRAM à l'intérieur du circuit intégré pour la mise en mémoire tampon.

  2. Mode vidéo. Semblable à l'interface RVB, il n'y a pas de GRAM, vous devez donc constamment flasher les données sur le panneau. Le mode vidéo est divisé en trois sous-modes.

• Mode sans rafale avec impulsions de synchronisation

• Mode non rafale avec événements de synchronisation

• Mode rafale. La compréhension simple est que le rapport de données effectif est plus élevé et que l’efficacité de la transmission est plus élevée.

  1. la voie signifie une paire de broches différentielles.
4.4.2 Broches MIPI-DSI

Les broches MIPI-DSI sont dédiées dans la plupart des circuits intégrés et n'ont pas besoin d'être configurées dans board.dtsi, tant que le matériel est connecté.

Cependant, les broches DSI de certains circuits intégrés ne sont pas dédiées et sont réutilisées avec des broches d'autres fonctions. Dans ce cas, pinctrl-0 et pinctrl-1 doivent être configurés.

Les broches du mipi-dsi sont différentielles et divisées en deux types de broches, l'une est une broche d'horloge et l'autre est une broche de données. Le nombre de broches de données est variable et l'unité de quantité est la voie. Chaque voie de broches contient en réalité deux lignes.

D'une manière générale, le nombre de voies mentionné dans le manuel de l'écran LCD fait référence au nombre de broches de données, à l'exclusion des broches d'horloge. Par exemple, un écran MIPI-DSI à 4 voies a un total de (4+1)*2 broches.

4.4.3 Alimentation MIPI-DSI

Généralement, il existe une alimentation qui alimente le module MIPI-DSI. Vous pouvez la considérer comme une alimentation par broche ou une alimentation de module. Différents circuits intégrés peuvent avoir des exigences de tension différentes pour cette alimentation. Une fois le modèle de circuit intégré déterminé, les exigences de tension de cette alimentation source de courant

Si la tension de ce circuit est modifiée sans autorisation, le module peut devenir anormal.

image-20221129105502705

Figure 4-7 : pinmux
4.4.4 Déterminer si un certain écran MIPI-DSI est pris en charge

1. Limitation de résolution. Il existe une limite de vitesse sur la voie et nous pouvons obtenir la limite de résolution maximale. La formule de calcul est la suivante. Tant que lane_speed ne dépasse pas la vitesse spécifiée dans la spécification IC ci-dessus, elle est théoriquement prise en charge.

Veuillez vérifier les spécifications IC.

lane_speed=lcd_vt * lcd_ht * fps * bit_per_pixel / lane_num / 1e9

• Unité : Gbit/s.

• fps : le taux de rafraîchissement attendu, qui peut être connu dans le manuel de l'écran, est généralement de 60. Veuillez consulter lcd_dclk_freq.

• bit_per_pixel : Le nombre de bits contenus dans chaque pixel, généralement 24 ou 18, est défini via lcd_dsi_format.

• lane_num : numéro de voie, défini par lcd_dsi_lane.

• 1e9:1000000000 écrit en notation scientifique.

  1. Lors du choix d'une résolution, vous devez prendre en compte la bande passante du système et les capacités DE. Par conséquent, même si l'interface prend en charge cette résolution, elle peut ne pas être prise en charge par l'ensemble du système. Par exemple, le matériel choisit une résolution à grande vitesse pour réduire les coûts.

Il est évidemment irréaliste d'utiliser une mémoire DDR très lente tout en souhaitant choisir un écran haute résolution.

  1. limite du nombre de voies. La plupart des circuits intégrés Allwinner prennent en charge jusqu'à 4 voies de MIPI-DSI. Si vous voyez un écran avec plus de 4 voies, il ne le prendra certainement pas en charge. Quelques circuits intégrés prennent en charge jusqu'à 8 voies, vous devez donc choisir ce modèle.

IC.

  1. La norme MIPI-DSI n'est pas conforme. Veuillez vérifier les spécifications IC.
4.4.5 Calculer la fréquence de la voie d'horloge MIPI-DSI

Utilisez un oscilloscope pour mesurer le signal d'horloge MIPI-DSI afin de déterminer si sa fréquence répond aux besoins de l'écran.

Tout d’abord, nous pouvons calculer la fréquence du signal CLK théorique à partir de l’horloge de pixel et du numéro de voie donnés, comme suit :

Freq_dsi_clk = (Dclk * colordepth * 3 / lane ) / 2
  1. Freq_dsi_clk : La fréquence de la broche d'horloge dsi que nous voulons mesurer. L'unité est le MHz.
  2. Dclk : horloge de pixels. Calculé à partir de la formule lcd_ht lcd_vt fps/1e6.
  3. Profondeur de couleur : profondeur de couleur, généralement 8 ou 6.
  4. Multiplier par 3 signifie qu'il y a 3 composants RVB.
  5. Lane : numéro de voie du dsi.
  6. Divisé par 2 : car l'horloge dsi est échantillonnée sur les deux bords.
4.4.6 Exemple de configuration d'écran du mode vidéo MIPI-DSI

La plupart des écrans MIPI-DSI sont configurés en mode vidéo.

Ce qui suit est un exemple typique de configuration board.dts pour le mode vidéo MIPI-DSI, dans lequel des lignes vides sont utilisées pour diviser la configuration en plusieurs parties.

  1. La première partie détermine si la configuration est utilisée et quel pilote d'écran utiliser. lcd_driver_name détermine quel pilote d'écran utiliser pour l'initialisation.
  2. La deuxième partie consiste à déterminer que la configuration est une interface dsi, et que l'interface dsi utilise le mode vidéo.
  3. La troisième partie détermine le timing de transmission du module LCD dans le SoC. Veuillez vérifier la description du paramètre de timing d'écran.
  4. La quatrième partie, les paramètres liés au rétroéclairage. Veuillez consulter les paramètres liés au rétroéclairage.
  5. Partie 5, paramètres détaillés de l'interface dsi.
  6. La sixième partie affiche les paramètres liés aux effets.
  7. Partie 7, paramètres de broches et d'alimentation. Veuillez consulter les paramètres d'alimentation et de broches.
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "k101im2qa04";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <0>;
    /* part 3 */
    lcd_x = <800>;
    lcd_y = <1280>;
    lcd_width = <135>;
    lcd_height = <216>;
    lcd_dclk_freq = <68>;
    lcd_hbp = <36>;
    lcd_ht = <854>;
    lcd_hspw = <18>;
    lcd_vbp = <12>;
    lcd_vt = <1320>;
    lcd_vspw = <4>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PB 8 1 0 3 1>;
    lcd_bright_curve_en = <0>;
    /* part 5 */
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    /* part 6 */
    lcd_frm = <0>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_pin_power = "dcdc1";
    lcd_pin_power1 = "eldo3";
    lcd_power = "dc1sw";
    lcd_gpio_0 = <&pio PD 22 1 0 3 1>;
    pinctrl-0 = <&dsi4lane_pins_a>;
    pinctrl-1 = <&dsi4lane_pins_b>;
};
4.4.7 Exemple de configuration d'écran ultra haute résolution MIPI-DSI

Selon le niveau de résolution, il est généralement divisé en plusieurs modes de configuration. Résolution 1080p et inférieure : définissez simplement lcd_dsi_if pour contrôler. Le mode commande est généralement un écran basse résolution, tandis que le mode vidéo

Et le mode rafale est destiné à la haute résolution. Si la résolution atteint 2k, des paramètres supplémentaires sont requis.

Un écran avec une résolution de 2k ou plus nécessite en fait jusqu'à 8 voies de données pour s'afficher normalement. Quatre des voies envoient des pixels impairs dans une image, et l'autre image envoie des pixels impairs.

illustrer

Notez que seuls certains circuits intégrés prennent en charge l'ultra-haute résolution. Veuillez consulter la partie MIPI-DSI des spécifications de la puce pour plus de détails.

Ce qui suit est un exemple de configuration board.dts MIPI-DSI haute résolution et ultra haute résolution (supérieure à 2k), dans lequel des lignes vides sont utilisées pour diviser la configuration en plusieurs parties.

  1. La première partie détermine si la configuration est utilisée et quel pilote d'écran utiliser. lcd_driver_name détermine quel pilote d'écran utiliser pour l'initialisation.
  2. La deuxième partie consiste à déterminer que la configuration est une interface dsi, et que l'interface dsi utilise le mode vidéo.
  3. La troisième partie détermine le timing de transmission du module LCD dans le SoC. Veuillez vérifier la description du paramètre de timing d'écran.
  4. La quatrième partie, paramètres liés au rétroéclairage, veuillez consulter les paramètres liés au rétroéclairage.
  5. Partie 5, paramètres détaillés de l'interface dsi.

Expliquez que
la raison pour laquelle lcd_dsi_lane est toujours défini sur 4 voies est qu'il s'agit de définir le nombre de voies pour un dsi, et cet écran nécessite deux dsi. Le total est de 8 voies.

À ce stade, les trois options lcd_tcon_mode, lcd_dsi_port_num et lcd_tcon_en_odd_even_div doivent être spécialement définies. Cliquez pour voir la signification spécifique. S'il s'agit d'un écran avec une résolution de 1080p et inférieure (utilisez uniquement

4 voies ou inférieur), alors ces trois configurations peuvent être réglées à 0 par défaut.
6. La sixième partie montre les paramètres de la partie effet.
7. La septième partie est la configuration des broches et de l'alimentation. Veuillez configurer selon le schéma de circuit. Veuillez consulter les paramètres d'alimentation et de broches.

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "lq101r1sx03";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <0>;
    /* part 3 */
    lcd_x = <2560>;
    lcd_y = <1600>;
    lcd_width = <216>;
    lcd_height = <135>;
    lcd_dclk_freq = <268>;
    lcd_hbp = <80>;
    lcd_ht = <2720>;
    lcd_hspw = <32>;
    lcd_vbp = <37>;
    lcd_vt = <1646>;
    lcd_vspw = <6>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PH 10 1 0 3 1>;
    /* part 5 */
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_port_num = <1>;
    lcd_tcon_mode = <4>;
    lcd_tcon_en_odd_even_div = <1>;
    /* part 6 */
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_power = "vcc18-lcd";
    lcd_power1 = "vcc33-lcd";
    lcd_pin_power = "vcc-pd";
    lcd_gpio_0 = <&pio PH 11 1 0 3 1>;
    lcd_gpio_1 = <&pio PH 12 1 0 3 1>;
};
4.4.8 Exemple de configuration de l'écran du mode commande MIPI-DSI

L'écran DSI en mode Commande est similaire à l'interface I8080. L'écran a de la RAM à l'intérieur pour la mise en mémoire tampon et le traitement de l'image. Dans ce cas, il est généralement nécessaire d'utiliser la broche te de l'écran pour déclencher l'interruption vsync, c'est donc différent d'autres types de DSI.

La différence avec l'écran est que la broche lcd_vsync doit être définie ici. La broche de l'écran est connectée à lcd_vsync et lcd_dsi_te est définie sur 1.

Le réglage de la broche Te est très critique. D'une manière générale, si l'écran a une broche Te, il doit être connecté. Sinon, l'écran sera déchiré lors de l'affichage d'images dynamiques, et le logiciel ne pourra pas le résoudre, ce qui entraînera directement le le matériel final ne pouvant pas être produit en série.

fruit.

Nous listons ici uniquement les principales différences par rapport au mode vidéo MIPI-DSI. Pour plus d'informations, veuillez vous référer à la section précédente.

  1. La première partie détermine si la configuration est utilisée et quel pilote d'écran utiliser. lcd_driver_name détermine quel pilote d'écran utiliser pour l'initialisation.
  2. La deuxième partie détermine que la configuration est une interface dsi et lcd_dsi_if est défini sur 1 pour indiquer le mode commande.
  3. La troisième partie détermine le timing de transmission du module LCD dans le SoC. Veuillez vérifier la description du paramètre de timing d'écran.
  4. La quatrième partie, les paramètres liés au rétroéclairage. Veuillez consulter les paramètres liés au rétroéclairage.
  5. Partie 5, paramètres détaillés de l'interface dsi. lcd_dsi_te, le définir sur 1 signifie ici activer le déclencheur.
  6. La sixième partie affiche les paramètres liés aux effets.
  7. Partie 7, paramètres de broches et d'alimentation. lcd_vsync, voici la broche te. Dans le matériel, cette broche doit être connectée à la broche te de l'écran. Dans le logiciel, elle doit être réglée sur la fonction vsync. Veuillez consulter les paramètres d'alimentation et de broches.
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "h245qbn02";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <1>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <432>;
    lcd_width = <52>;
    lcd_height = <52>;
    lcd_dclk_freq = <18>;
    lcd_hbp = <96>;
    lcd_ht = <480>;
    lcd_hspw = <2>;
    lcd_vbp = <21>;
    lcd_vt = <514>;
    lcd_vspw = <2>;
    /* part 4 */
    lcd_backlight = <100>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bright_curve_en = <0>;
    lcd_bl_en = <&pio PB 3 1 0 3 1>;
    /* part 5 */
    lcd_dsi_lane = <1>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <1>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_power = "axp233_dc1sw"
    lcd_power1 = "axp233_eldo1"
    lcd_gpio_0 = <&pio PB 2 1 0 3 0>;
    lcd_vsync = <&pio PD 21 2 0 3 0>;
};
4.4.9 Exemple de configuration double écran MIPI-DSI VR

La scène réelle est constituée de deux écrans physiques, chaque écran est en 1080p et chaque écran comporte 4 voies. Il est nécessaire que les deux écrans affichent chacun la moitié gauche et droite d'un cadre d'image. En raison du rapport d'aspect, les écrans horizontaux et verticaux , et capacités de traitement DE, facteur,

Un DE + un tcon + deux DSI ne suffisent plus, il faut utiliser deux tcon pour piloter un dsi chacun, cependant les deux afficheurs doivent être synchronisés, ce qui nécessite d'utiliser le mode synchronisation des deux tcon.

  1. LCD0 est marqué comme tcon esclave, qui est piloté par le tcon maître (lcd_tcon_mode est défini).

  2. LCD1 est marqué comme master tcon et est responsable de tous les commutateurs d'alimentation, de rétroéclairage et de broches des deux écrans.

  3. Allumez les broches, l'alimentation, etc. du LCD1. LCD0 est allumé en premier et les registres du module correspondant sont initialisés, mais l'alimentation n'est pas allumée. Ensuite, allumez LCD1. Lorsque LCD1 est activé, LCD0 sera déclenché pour envoyer des données ensemble. Fais ça en même temps

Allumé et éteint.

illustrer

Remarque : seuls quelques circuits intégrés prennent en charge ce mode

&lcd0 {
    lcd_used = <1>;
    lcd_driver_name = "lpm025m475a";
    ;lcd_bl_0_percent = <0>;
    ;lcd_bl_40_percent = <23>;
    ;lcd_bl_100_percent = <100>;
    lcd_backlight = <50>;
    lcd_if = <4>;
    lcd_x = <1080>;
    lcd_y = <1920>;
    lcd_width = <31>;
    lcd_height = <56>;
    lcd_dclk_freq = <141>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <20000>;
    lcd_pwm_pol = <0>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <100>;
    lcd_ht = <1212>;
    lcd_hspw = <5>;
    lcd_vbp = <8>;
    lcd_vt = <1936>;
    lcd_vspw = <2>;
    lcd_dsi_if = <0>;
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_eotp = <0>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_dsi_port_num = <0>;
    lcd_tcon_mode = <3>;
    lcd_slave_stop_pos = <0>;
    lcd_sync_pixel_num = <0>;
    lcd_sync_line_num = <0>;
    };
&lcd1 {
    lcd_used = <1>;
    lcd_driver_name = "lpm025m475a";
    ;lcd_bl_0_percent = <0>;
    ;lcd_bl_40_percent = <23>;
    ;lcd_bl_100_percent = <100>;
    lcd_backlight = <50>;
    lcd_if = <4>;
    lcd_x = <1080>;
    lcd_y = <1920>;
    lcd_width = <31>;
    lcd_height = <56>;
    lcd_dclk_freq = <141>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <20000>;
    lcd_pwm_pol = <0>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <100>;
    lcd_ht = <1212>;
    lcd_hspw = <5>;
    lcd_vbp = <8>;
    lcd_vt = <1936>;
    lcd_vspw = <2>;
    lcd_dsi_if = <0>;
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_eotp = <0>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_dsi_port_num = <0>;
    lcd_tcon_mode = <1>;
    lcd_tcon_slave_num = <0>;
    lcd_slave_stop_pos = <0>;
    lcd_sync_pixel_num = <0>;
    lcd_sync_line_num = <0>;
    lcd_bl_en = <&pio PH 10 1 0 3 1>;
    lcd_power = "vcc-dsi";
    lcd_power1 = "vcc18-lcd";
    lcd_power2 = "vcc33-lcd";
    lcd_gpio_0 = <&pio PH 8 1 0 3 1>;
    lcd_gpio_1 = <&pio PH 11 1 0 3 1>;
    lcd_gpio_2 = <&pio PH 12 1 0 3 1>;
    lcd_pin_power = "vcc-ph"
};

4.5 Interface I8080

4.5.1 Aperçu

L'écran d'interface Intel 8080 (également appelé interface MCU) est un protocole très ancien et est généralement utilisé sur des écrans avec de très petites résolutions.

Ligne de signalisation :

• Signal de sélection de puce CS, détermine si la puce fonctionne.

• Signal de sélection de registre RS, faible signifie sélectionner un index ou un registre d'état, haut signifie sélectionner un registre de contrôle. Dans les scénarios réels, il est généralement connecté à la broche LCD_DE (broche d'activation des données) du SoC.

• Le signal de distinction de commande de données /WR (low signifie écrire des données), qui est le signal d'horloge d'écriture, généralement connecté à la broche LCD_CLK du SoC.

• Le signal de lecture de données /RD (low signifie lire les données), qui est le signal d'horloge de lecture, est généralement connecté à la broche LCD_HSYNC du SoC.

• RESET Réinitialisez l'écran LCD (utilisez la série de commandes fixes 0 1 0 pour réinitialiser).

• Données Bus de données pour transmission bidirectionnelle.

Les interfaces de largeur de bits de données basées sur I8080 sont 8/9/16/18. Quelles broches sont connectées à la référence ? Même si la largeur de bits est la même, les broches connectées sont différentes. Un autre facteur à considérer est le format RVB.

  1. RGB565, il y a un total de 65 000 couleurs.

  2. RGB666, un total de 262 000 couleurs.

  3. 9 bits est fixé à 262 Ko.

Apprenez du manuel de l'écran : largeur de bits des données, somme du nombre de couleurs, reportez-vous au schéma de configuration des broches RVB et I8080 pour la connexion matérielle.

4.5.2 Exemple de configuration typique de l'écran d'interface I8080

Ce qui suit est un exemple typique de configuration board.dts d'un écran d'interface RGB565, I8080 8 bits.

​ 1. La première partie détermine si la configuration est utilisée et quel pilote d'écran utiliser. lcd_driver_name détermine quel pilote d'écran utiliser pour l'initialisation.

​ 2. Dans la deuxième partie, il est décidé que la configuration est l'interface I8080, et qu'elle est au format 8 bits/2 cycles RGB565.

Conseils
Pourquoi s'appelle-t-il 8 bits/2 cycles RVB565 ?Tout d'abord, son format est RVB565, c'est-à-dire qu'un pixel fait 16 bits, puis il a une largeur de bits de 8 bits, ce qui nécessite deux cycles d'horloge pour envoyer un pixel, donc il est

Appelé 2 cycles.

  1. La troisième partie détermine le timing de transmission du module LCD dans le SoC. Veuillez vérifier la description du paramètre de timing d'écran. La particularité ici est que l'horloge des pixels doit être réglée pour satisfaire la formule suivante : lcd_dclk_freq 2>=lcd_ht lcd_vt fps, ou lcd_dclk_freq=lcd_ht
    2 lcd_vt
    60, c'est-à-dire soit double lcd_ht, soit double lcd_dclk_freq.

  2. La quatrième partie, les paramètres liés au rétroéclairage. Veuillez consulter les paramètres liés au rétroéclairage.

  3. Partie 5 : Paramètres détaillés de l'interface CPU. Ici, lcd_cpu_te et lcd_cpu_mode sont activés, ce qui signifie que le déclencheur est utilisé et que l'intervalle de déclenchement est spécifié. Il s’agit d’un paramètre très critique.

  4. La sixième partie affiche les paramètres liés aux effets. L'activation de lcd_frm ici est également un paramètre clé. Cliquez pour voir la signification détaillée.

  5. Partie 7, paramètres de broches et d'alimentation. Afin d'utiliser te pour déclencher ici, lcd_vsync doit également être défini. La définition de la fonction de ce pied est déjà incluse dans pinctrl-0. Un jeu d’épingles est personnalisé ici. Référence RVB et

Schéma de configuration des broches I8080. En déterminant la largeur de bit et le format de pixel (nombre de couleurs) du I8080, déterminez quelles broches doivent être connectées dans le tableau. Veuillez consulter les paramètres d'alimentation et de broches.

&pio {
    I8080_8bit_pins_a: I8080_8bit@0 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,function = "I8080_8bit";
        allwinner,muxsel = <2>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
    };
    I8080_8bit_pins_b: I8080_8bit@1 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,function = "I8080_8bit_suspend";
        allwinner,muxsel = <7>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
	};
};
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "s2003t46g";
    /* part 2 */
    lcd_if = <1>;
    lcd_cpu_if = <14>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <320>;
    lcd_width = <108>;
    lcd_height = <64>;
    lcd_dclk_freq = <16>;
    lcd_hbp = <20>;
    lcd_ht = <298>;
    lcd_hspw = <10>;
    lcd_vbp = <8>;
    lcd_vt = <336>;
    lcd_vspw = <4>;
    /* part 4 */
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bright_curve_en = <1>;
    /* part 5 */
    lcd_cpu_mode = <1>;
    lcd_cpu_te = <1>;
    /* part 6 */
    lcd_frm = <1>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_rb_swap = <0>;
    /* part 7 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    ;reset pin
    lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
    ;cs pin
    lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
    pinctrl-0 = <&I8080_8bit_pins_a>;
    pinctrl-1 = <&I8080_8bit_pins_a>;
};

4.6 Interface LVDS

4.6.1 Aperçu

LVDS signifie Low Voltage Differential Signaling, qui est une interface de signal différentiel basse tension.

4.6.2 Configuration typique LVDS à liaison unique

Pour l'interface LVDS, les broches lvds correspondant à lcd0 et les broches lvds correspondant à lcd1 sont fixes et différentes.

Étant donné que le protocole lvds n'a pas la capacité de transmettre des données, le côté écran n'a généralement besoin d'aucune initialisation, seul le côté SoC doit être initialisé. Donc le lcd_driver_name ici est toujours "default_lcd", bien sûr vous pouvez

Une optimisation spéciale est effectuée pour le délai de démarrage de l'initialisation.

Ce qui suit est un exemple typique de configuration board.dts pour un écran lvds à lien unique, dans lequel des lignes vides sont utilisées pour diviser la configuration en plusieurs parties.

  1. La première partie détermine si la configuration est utilisée et quel pilote d'écran utiliser. lcd_driver_name détermine quel
    pilote d'écran utiliser pour l'initialisation.

  2. La deuxième partie consiste à décider si la configuration est une interface lvds et un lien unique.
    Conseils
    S'il s'agit d'un écran Dual Link, en plus de changer lcd_lvds_if à 1, les broches de lcd1 doivent également être déplacées vers le bas, c'est-à-dire qu'il faut configurer un total de PD0 à PD9 et PD10 à

Un total de vingt broches du PD19 sont des fonctions de broches LVDS (fonction 3). Bien entendu, le timing de l'écran doit également être modifié en fonction de l'écran.

  1. La troisième partie détermine le timing de transmission du module LCD dans le SoC. Veuillez vérifier la description du paramètre de timing d'écran.

  2. La quatrième partie, les paramètres liés au rétroéclairage. Veuillez consulter les paramètres liés au rétroéclairage.

  3. Partie 5, paramètres détaillés de l'interface lvds.

  4. La sixième partie affiche les paramètres liés aux effets.

  5. Partie 7, paramètres de broches et d'alimentation. Veuillez consulter les paramètres d'alimentation et de broches.

&lcd0 {
    /* part 1 */
    lcd_used = 1
    lcd_driver_name = "default_lcd";
    /* part 2 */
    lcd_if = 3
    lcd_lvds_if = 0
    /* part 3 */
    lcd_x = 1280
    lcd_y = 800
    lcd_width = 150
    lcd_height = 94
    lcd_dclk_freq = 70
    lcd_hbp = 20
    lcd_ht = 1418
    lcd_hspw = 10
    lcd_vbp = 10
    lcd_vt = 814
    lcd_vspw = 5
    /* part 4 */
    lcd_pwm_used = 1
    lcd_pwm_ch = 0
    lcd_pwm_freq = 50000
    lcd_pwm_pol = 0
    lcd_pwm_max_limit = 255
    lcd_backlight = 50
    lcd_bright_curve_en = 0
    lcd_bl_en = <&pio PD 21 1 0 3 1>;
    /* part 5 */
    lcd_lvds_colordepth = 1
    lcd_lvds_mode = 0
    /* part 6 */
    lcd_frm = 1
    lcd_hv_clk_phase = 0
    lcd_hv_sync_polarity= 0
    lcd_gamma_en = 0
    lcd_cmap_en = 0
    /* part 7 */
    lcd_power = "vcc-lcd"
    pinctrl-0 = <&lvds0_pins_a>;
    pinctrl-1 = <&lvds0_pins_b>;
};

4.6.3 Configuration typique LVDS à double liaison

Si l'écran Dual Link :

  1. lcd_lvds_if est défini sur 1 (scénario 1) ou 2 (scénario 2).
  2. En termes de configuration des broches, il est également passé de 4 voies de données à 8 voies de données, dont un total de 20 broches dans la voie clk.

Scénario 1, connectant physiquement un écran avec 8 voies de données, le SoC transmet la moitié des pixels, les pixels impairs ou pairs toutes les 4 voies.

&lcd1 {
    lcd_used = <1>;
    lcd_driver_name = "bp101wx1";
    lcd_backlight = <50>;
    lcd_if = <3>;
    lcd_x = <2560>;
    lcd_y = <800>;
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_dclk_freq = <138>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <2>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <40>;
    lcd_ht = <2836>;
    lcd_hspw = <20>;
    lcd_vbp = <10>;
    lcd_vt = <814>;
    lcd_vspw = <5>;
    lcd_lvds_if = <1>;
    lcd_lvds_colordepth = <0>;
    lcd_lvds_mode = <0>;
    lcd_frm = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_fsync_en = <0>;
    lcd_fsync_act_time = <1000>;
    lcd_fsync_dis_time = <1000>;
    lcd_fsync_pol = <0>;
    deu_mode = <0>;
    lcdgamma4iep = <22>;
    smart_color = <90>;
    lcd_bl_en = <&pio PJ 27 1 0 3 1>;
    lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
    lcd_pin_power = "bldo5";
    lcd_power = "dc1sw";
    pinctrl-0 = <&lcd1_lvds2link_pins_a>;
    pinctrl-1 = <&lcd1_lvds2link_pins_b>;
};

Scénario 2 (pris en charge par certains circuits intégrés). Deux écrans sont connectés physiquement. Chaque écran comporte 4 voies. Les deux écrans sont du même modèle, avec la même résolution et la même synchronisation. À l'heure actuelle, certains circuits intégrés prennent en charge l'envoi de tous les pixels à chaque écran. ,accomplir

Double affichage (double affichage sur le signal), veuillez noter qu'à ce moment, le timing lcd est le timing d'un écran, et lcd_lvds_if est 2.

lcd1: lcd1@01c0c001 {
    lcd_used = <1>;
    lcd_driver_name = "bp101wx1";
    lcd_backlight = <50>;
    lcd_if = <3>;
    lcd_x = <1280>;
    lcd_y = <800>;
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_dclk_freq = <70>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <2>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <20>;
    lcd_ht = <1418>;
    lcd_hspw = <10>;
    lcd_vbp = <10>;
    lcd_vt = <814>;
    lcd_vspw = <5>;
    lcd_lvds_if = <2>;
    lcd_lvds_colordepth = <0>;
    lcd_lvds_mode = <0>;
    lcd_frm = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_fsync_en = <0>;
    lcd_fsync_act_time = <1000>;
    lcd_fsync_dis_time = <1000>;
    lcd_fsync_pol = <0>;
    deu_mode = <0>;
    lcdgamma4iep = <22>;
    smart_color = <90>;
    lcd_bl_en = <&pio PJ 27 1 0 3 1>;
    lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
    lcd_pin_power = "bldo5";
    lcd_power = "dc1sw";
    pinctrl-0 = <&lcd1_lvds2link_pins_a>;
    pinctrl-1 = <&lcd1_lvds2link_pins_a>;
};

4.7 Schéma de configuration des broches RVB et I8080

image-20221129120014562

Figure 4-8 : pinmux

4.8 Notes sur la migration de sys_config.fex vers board.dtsi

Pour des raisons de standardisation et d'autres raisons, certaines plates-formes implémentent la configuration dans board.dtsi. Ce qui suit décrit les précautions à prendre pour modifier board.dtsi.

4.8.1 Définition des broches

Lors de la configuration d'un écran RVB ou d'un écran LVDS, il n'est pas nécessaire de définir des définitions complexes, pas besoin de savoir quelles broches doivent être configurées et pas besoin du nœud lcd0_suspend. où se trouve le nom rgb24_pins_a

Une fois défini, vous pouvez l'utiliser directement. Généralement, les configurations directement disponibles pour les écrans LCD seront indiquées dans les commentaires. Vous pouvez utiliser le platform-pinctrl dans le répertoire du noyau arch/arm/boot/dts ou arch/arm64/boot/ dts.dtsi texte

Trouvez-le dans le fichier.

exemple:

pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//休眠时候的定义,io_disable

Bien entendu, vous pouvez également personnaliser un jeu de pieds et les écrire dans board.dtsi, à condition que le nom ne répète pas le nom existant.

Par souci de standardisation, nous conserverons des noms cohérents sur toutes les plates-formes, où le suffixe a signifie que la broche est activée et b signifie que io_disable est utilisé lorsque l'appareil est éteint.

Les définitions de broches suivantes sont actuellement disponibles :

Tableau 4-2 : Afficher le tableau des noms de broches
Nom de la broche décrire
rgb24_pins_a et rgb24_pins_b Interface d'écran RVB, et la largeur des bits de données est de 24, RVB888
rgb18_pins_a et rgb18_pins_b Interface d'écran RVB, et la largeur des bits de données est de 16, RVB666
lvds0_pins_a et lvds0_pins_b Interface LVDS à liaison unique, définition de 0 broches (affichage principal lcd0)
lvds1_pins_a et lvds1_pins_b Interface LVDS à liaison unique, définition à 1 broche (affichage principal lcd0)
lvds2link_pins_a et lvds2link_pins_b Définition des broches de l'interface LVDS à double liaison (écran principal lcd0)
lvds2_pins_a et lvds2_pins_b Interface LVDS à liaison unique, définition de 0 broche (écran principal lcd1)
lvds3_pins_a et lvds3_pins_b Interface LVDS à liaison unique, définition à 1 broche (écran principal lcd1)
lcd1_lvds2link_pins_a et lcd1_lvds2link_pins_b Définition des broches de l'interface LVDS à double liaison (affichage principal LCD1)
dsi4lane_pins_a et dsi4lane_pins_b Définition des broches de l'interface écran DSI, 4 voies, s'il s'agit d'un autre numéro de voie, uniquement
4.8.2 Définition de l'alimentation

Il n'est pas nécessaire de prêter attention à la définition de l'alimentation dans l'ancien SDK. Vous pouvez directement attribuer la chaîne d'alias de axp à un attribut tel que lcd_power. Cependant, dans le nouveau SDK, si vous devez utiliser une certaine alimentation, vous doit en premier

Il est défini dans le nœud disp, et la chaîne utilisée dans la partie lcd doit être cohérente avec celle définie dans disp. Par exemple, l'exemple suivant :

disp: disp@01000000 {
    disp_init_enable = <1>;
    disp_mode = <0>;
    /* VCC-LCD */
    dc1sw-supply = <&reg_sw>;
    /* VCC-LVDS and VCC-HDMI */
    bldo1-supply = <&reg_bldo1>;
    /* VCC-TV */
    cldo4-supply = <&reg_cldo4>;
};

Parmi eux, "-supply" est fixe et la chaîne qui le précède est arbitraire, mais il est recommandé de choisir un nom significatif. Les éléments suivants comme <®_sw> doivent être trouvés dans le nœud régulateur0 de board.dtsi.

Ensuite, dans le nœud lcd0, si vous souhaitez utiliser reg_sw, écrivez-le simplement comme suit : dc1sw correspond à dc1sw-supply.

lcd_power=”dc1sw”

Puisqu'il existe également un pilote axp et un pilote d'affichage dans u-boot, ils lisent la même configuration que le noyau. Afin d'être compatibles entre eux, il existe les restrictions suivantes lors de la dénomination.

Dans u-boot 2018, le pilote axp ne reconnaît que les noms définis dans la puce axp comme bldo1, donc lorsque vous nommez xxxsupply, il est préférable de le nommer selon la définition de la puce axp.

4.8.3 Autres précautions

board.dtsi peut contenir uniquement lcd0 mais pas de lcd1, ou uniquement tv0 mais pas de tv1. Si vous souhaitez l'ajouter à ce moment, vous devez vous référer à la plate-forme correspondante dans le répertoire du noyau arch/arm/boot/dts ou arch/ arm64/boot/dts.

Fichier .dtsi. Le plus important est que la chaîne d'adresses après @ doit être cohérente avec la définition dans le noyau, par exemple :

lcd1: lcd1@01c0c000

5 Description des paramètres matériels

5.1 Description des paramètres de l'interface LCD

5.1.1 nom_pilote_lcd

Le nom du pilote de l'écran LCD (chaîne) doit correspondre au nom du pilote de l'écran.

5.1.2 lcd_model_name

Le nom du modèle d'écran LCD, en option, peut être utilisé dans le même pilote d'écran pour distinguer davantage les différents écrans.

5.1.3 lcd_if

Interface LCD

La signification correspondante de la définition de la valeur correspondante est :

0:HV RGB接口
1:CPU/I80接口
2:Reserved
3:LVDS接口
4:DSI接口
5.1.4 lcd_hv_if

Interface de panneau LCD HT

Ce paramètre n'est valide que lorsque lcd_if=0. Définissez plusieurs types d’interface sous l’écran de synchronisation RVB.

La signification correspondante de la définition de la valeur correspondante est :

0:Parallel RGB
8:Serial RGB
10:Dummy RGB
11:RGB Dummy
12:Serial YUV (CCIR656)
5.1.5 lcd_hv_clk_phase

Panneau Lcd HV Horloge Phase

Ce paramètre n'est valide que lorsque lcd_if=0. Définissez la relation de phase entre l'horloge et les données de l'écran de synchronisation RVB. Il y a un total de 4 phases disponibles pour le réglage.

La signification correspondante de la définition de la valeur correspondante est :

0: 0 degree
1: 90 degree
2: 180 degree
3: 270 degree
5.1.6 lcd_hv_sync_polarité

Panneau Lcd HV Signaux de synchronisation Polarité

Ce paramètre n'est valide que lorsque lcd_if=0. Définissez la polarité de hsync et vsync pour l'écran de synchronisation RVB.

La signification correspondante de la définition de la valeur correspondante est :

0:vsync active low,hsync active low
1:vsync active high,hsync active low
2:vsync active low,hsync active high
3:vsync active high,hsync active high
5.1.7 lcd_hv_srgb_seq

Panneau Lcd HV Séquence de sortie RVB série

Ce paramètre n'est valide que lorsque lcd_if=0 et lcd_hv_if=8 (Serial RGB).

Définissez l'ordre de sortie RVB pour les lignes impaires :

0: Odd lines R-G-B; Even line R-G-B
1: Odd lines B-R-G; Even line R-G-B
2: Odd lines G-B-R; Even line R-G-B
4: Odd lines R-G-B; Even line B-R-G
5: Odd lines B-R-G; Even line B-R-G
6: Odd lines G-B-R; Even line B-R-G
8: Odd lines R-G-B; Even line B-R-G
9: Odd lines B-R-G; Even line G-B-R
10: Odd lines G-B-R; Even line G-B-R
5.1.8 lcd_hv_syuv_seq

Panneau Lcd HV Sortie série YUV Séquence

Ce paramètre n'est valide que lorsque lcd_if=0 et lcd_hv_if=12 (Serial YUV).

Définir le format de sortie YUV :

0:YUYV
1:YVYU
2:UYVY
3:VYUY
5.1.9 lcd_hv_syuv_fdly

Panneau Lcd HV Série YUV F ligne Retard

Ce paramètre n'est valide que lorsque lcd_if=0 et lcd_hv_if=12 (Serial YUV).

Définissez le nombre de lignes pendant lesquelles F est retardé par rapport aux lignes valides lors du codage CCIR656 :

0:F toggle right after active video line
1:Delay 2 lines (CCIR PAL)
2:Delay 3 lines (CCIR NTSC)
5.1.10 lcd_cpu_if

Interface du panneau CPU Lcd

Ce paramètre n'est valide que lorsque lcd_if = 1. Pour une synchronisation spécifique, veuillez vous référer aux colonnes CPU dans le schéma de configuration des broches RVB et I8080.

La signification correspondante de la définition de la valeur correspondante est :

0:18bit/1cycle (RGB666)
2: 16bit/3cycle (RGB666)
4:16bit/2cycle (RGB666)
6:16bit/2cycle (RGB666)
8:16bit/1cycle (RGB565)
10:9bit/1cycle (RGB666)
12:8bit/3cycle (RGB666)
14:8bit/2cycle (RGB565)
5.1.11 lcd_cpu_te

Effet de déchirure du panneau CPU Lcd

La signification correspondante de la définition de la valeur correspondante est que lorsqu'il est défini sur 0, le temps d'intervalle de rafraîchissement est lcd_ht × lcd_vt ; lorsqu'il est défini sur 1 ou 2, le temps d'intervalle de rafraîchissement est de deux impulsions :

Effet de déchirure du panneau CPU Lcd

La signification correspondante de la définition de la valeur correspondante est que lorsqu'il est défini sur 0, le temps d'intervalle de rafraîchissement est lcd_ht × lcd_vt ; lorsqu'il est défini sur 1 ou 2, le temps d'intervalle de rafraîchissement est de deux impulsions :

0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge
5.1.12 lcd_lvds_if

Interface du panneau LCD LVDS

La signification correspondante de la définition de la valeur correspondante est :

0:Single Link( 1 clock pair+3/4 data pair)
1:Dual Link(8 data lane,每4条lane接受一半像素,奇数像素或者偶数像素)
2: Dual Link (每4条lane接受全部像素,常用于物理双屏,且两个屏一样)

Le scénario où lcd_lvds_if est égal à 2 consiste à connecter deux écrans identiques, puis les deux écrans affichent le même contenu. À ce stade, les autres timings de l'écran LCD n'ont besoin que de remplir le timing d'un écran.

5.1.13 lcd_lvds_colordegree

Profondeur de couleur du panneau LCD LVDS

La signification correspondante de la définition de la valeur correspondante est :

0:8bit per color(4 data pair)
1:6bit per color(3 data pair)

5.1.14 lcd_lvds_mode

Mode LCD LVDS

Ce paramètre n'est valide que lorsque lcd_lvds_bitwidth=0.

La signification correspondante du réglage de la valeur correspondante est (voir la figure ci-dessous) :

0:NS mode
1:JEIDA mode

image-20221129173201413

Figure 5-1 : mode LVDS
5.1.15 lcd_dsi_if

Interface de panneau Lcd MIPI DSI

Ce paramètre n'est valide que lorsque lcd_if=4. Définissez deux types d'écrans MIPI DSI.

La signification correspondante de la définition de la valeur correspondante est :

0:Video mode
1:Command mode
2:video burst mode

Remarque : L'écran LCD en mode Vidéo rafraîchit l'écran en temps réel, avec des définitions de paramètres de timing tels que ht et hbp ; l'écran en mode Commande dispose d'un Buffer d'affichage sur l'écran et dispose généralement d'une broche TE.

5.1.16 lcd_dsi_lane

Numéro de voie de données du panneau Lcd MIPI DSI

Ce paramètre n'est valide que lorsque lcd_if=4.

La signification correspondante de la définition de la valeur correspondante est :

1:1 data lane
2:2 data lane
3:3 data lane
4:4 data lane
5.1.17 format_lcd_dsi

Format de pixel de données du panneau Lcd MIPI DSI

Ce paramètre n'est valide que lorsque lcd_if=4.

La signification correspondante de la définition de la valeur correspondante est :

0:Package Pixel Stream, 24bit RGB
1:Loosely Package Pixel Stream, 18bit RGB
2:Package Pixel Stream, 18bit RGB
3:Package Pixel Stream, 16bit RGB
5.1.18 lcd_dsi_the

Dalle Lcd MIPI DSI Effet Déchirure

Ce paramètre n'est valide que lorsque lcd_if=4.

La signification correspondante de la définition de la valeur correspondante est :

0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge

Remarque : Lorsqu'il est défini sur 0, l'intervalle de rafraîchissement est lcd_ht × lcd_vt ; lorsqu'il est défini sur 1 ou 2, l'intervalle de rafraîchissement est de deux impulsions te.

La fonction de celui-ci est d'envoyer un signal de l'extrémité de l'écran à l'extrémité du SoC pour le signal de synchronisation. Si cette variable est activée, l'interruption d'affichage à l'intérieur du SoC sera déclenchée par cette broche externe.

5.1.19 lcd_dsi_port_num

quantité de Port écran DSI

Ce paramètre n'est valide que lorsque lcd_if=4.

La signification correspondante de la définition de la valeur correspondante est :

0:一个port
1:两个port

Une fonction de cette option est que lorsqu'un seul écran LCD comporte 8 voies, si un seul circuit intégré de pilote doit être initialisé, ce paramètre est 1. Si les deux circuits intégrés de pilote doivent être initialisés, réglez-le sur 0. Et utilisez les fonctions définies dans lcd_source.c pour l'initialisation.

5.1.20 lcd_tcon_mode

Mode Tcon

Ce paramètre n'est valide que lorsque lcd_if=4.

La signification correspondante de la définition de la valeur correspondante est :

0:normal mode
1:tcon master mode(在第一次发送数据同步)
2::tcon master mode(每一帧都同步)
3:tcon slave mode(依靠master mode来启动)
4:one tcon driver two dsi(8条lane)
5.1.21 lcd_slave_tcon_num
5.1.21 lcd_slave_tcon_num

Numéro de série du Slave Tcon

Ce paramètre n'est valide que lorsque lcd_if=4 et lcd_tcon_mode est égal à 1 ou 2. Utilisé pour indiquer à tcon en mode maître quel est le numéro de séquence du tcon esclave.

La signification correspondante de la définition de la valeur correspondante est :

0:tcon_lcd0
1:tcon_lcd1
5.1.22 lcd_tcon_en_odd_even_div

Ce paramètre n'est valide que lorsque lcd_if=4 et lcd_tcon_mode=4.

La signification correspondante de la définition de la valeur correspondante est :

0:tcon将一帧图像分左右两半来发送给两个DSI模块
1:tcon将一帧图像分奇偶像素来发给两个DSI模块
5.1.23 lcd_sync_pixel_num

Ce paramètre n'est valide que lorsque lcd_if=4 et lcd_tcon_mode est égal à 2 ou 3.

Définissez le pixel de départ de la synchronisation à partir de tcon.

Nombre entier : pas plus que lcd_ht

5.1.24 lcd_sync_line_num

Ce paramètre n'est valide que lorsque lcd_if=4 et lcd_tcon_mode est égal à 2 ou 3.

Définissez la ligne de départ de la synchronisation à partir de tcon.

Nombre entier : pas plus que lcd_vt

5.1.25 lcd_cpu_mode

Mode CPU LCD, contrôle.

La signification correspondante de la définition de la valeur correspondante est que lorsqu'il est défini sur 0, le temps d'intervalle de rafraîchissement est lcd_ht × lcd_vt ; lorsqu'il est défini sur 1 ou 2, le temps d'intervalle de rafraîchissement est de deux impulsions :

0:中断自动根据时序,由场消隐信号内部触发。
1:中断根据数据Block的counter触发或者由外部te触发。
5.1.26 lcd_fsync_fr

L'écran LCD active la fonction fsync, qui est utilisée pour déclencher la sortie d'images par le capteur pour la synchronisation. Certains circuits intégrés le prennent en charge.

0:disable
1:enable
5.1.27 lcd_fsync_act_time

Fonction fsync de l'écran LCD, durée du niveau effectif, unité : le nombre d'horloges de pixels.

0~lcd_ht-1
5.1.28 lcd_fsync_dis_time

Fonction fsync de l'écran LCD, durée du niveau invalide, unité : le nombre d'horloges de pixels.

0~lcd_ht-1
5.1.29 lcd_fsync_pol

La polarité des niveaux actifs de la fonction fsync de l'écran LCD.

0:有效电平为低
1:有效电平为高

5.2 Description des paramètres de synchronisation d'écran

Les paramètres suivants sont très critiques pour le réglage de l'écran et déterminent le timing des données envoyées par l'expéditeur (SoC). Puisqu'il s'agit de déboguer l'expéditeur et le destinataire, à l'exception de la résolution et de la taille, les autres valeurs ne sont pas absolument incorrectes.

Oui, deux écrans avec la même résolution et la même interface peuvent avoir des valeurs différentes.

Les moyens pour l'obtenir sont les suivants :

  1. Demandez au fabricant de l'écran LCD.
  2. Recherchez-le dans le manuel de l'écran ou dans le manuel du pilote IC (demandez ces documents au fabricant de l'écran), comme indiqué dans la figure ci-dessous.

image-20221129174730302

Figure 5-2 : lcd_info1

image-20221129174744511

Figure 5-3 : lcd_info2
  1. Si vous ne parvenez pas à faire les choses correctement au cours des deux premières étapes, vous pouvez le définir selon les normes vesa, principalement les normes DMT et CVT.

Parmi eux, DMT fait référence aux « Normes et directives VESA et industrielles pour la synchronisation des écrans d'ordinateur (DMT) ». Téléchargez la norme, qui contient diverses résolutions couramment utilisées.

Horaire. Le CVT fait référence à la « norme VESA Cooperative Video Timings (CVT) », qui fournit une formule générale pour calculer le timing d'une résolution, d'un taux de rafraîchissement et d'autres paramètres spécifiés.

Vous pouvez télécharger cette feuille Excel pour calculer le générateur de synchronisation vidéo coordonné VESA.

À partir des deux formules suivantes, nous n'avons pas besoin de définir les paramètres lcd_hfp et lcd_vfp, car le pilote calculera automatiquement lcd_hfp et lcd_vfp en fonction de plusieurs autres paramètres connus.

lcd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp
lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp
5.2.1 lcd_x

Le nombre de pixels horizontaux de l'affichage, qui correspond à la largeur de la résolution de l'écran.

5.2.2 lcd_y

Le nombre de lignes verticales de l'écran d'affichage, qui correspond à la résolution d'écran la plus élevée.

5.2.3 lcd_ht

Durée totale horizontale

Fait référence au nombre total de cycles dclk consécutifs. Voir ci-dessous:

image-20221129175141962

Figure 5-4 : LCDHT
5.2.4 lcd_hbp

Porche arrière horizontal

Il fait référence au nombre de cycles dclk entre les lignes valides, au début du signal de synchronisation de ligne (hsync) et au début des données valides, y compris la zone du signal de synchronisation. Voir l'image ci-dessus. Notez que le segment hspw est inclus.

Notez
qu'il contient le segment hspw, c'est-à-dire lcd_hbp=actual hbp+actual hspw

5.2.5 lcd_hspw

Largeur d'impulsion de synchronisation horizontale

Fait référence à la largeur du signal de synchronisation horizontale. L'unité est le temps de 1 dclk (c'est-à-dire le temps de 1 cycle de données). Voir photo ci-dessus.

5.2.6 lcd_vt

Temps total vertical

Fait référence au nombre total de lignes dans un champ. Voir ci-dessous:

image-20221129182148157

Figure 5-5 : écran LCD
5.2.7 lcd_vbp

Porche arrière vertical

Fait référence au nombre de lignes entre le début du signal de synchronisation de champ (vsync) et le début de la ligne de données valide, y compris la zone du signal de synchronisation de champ.

illustrer

Il contient le segment vspw, c'est-à-dire lcd_vbp=actual vbp+actual vspw

5.2.8 lcd_vspw

Largeur d'impulsion de synchronisation verticale

Fait référence à la largeur du signal de synchronisation de champ. L'unité est en ligne. Voir photo ci-dessus.

5.2.9 lcd_dclk_freq

Fréquence d'horloge de points

Fréquence de transmission des pixels de transmission. L'unité est le MHz.

fps = (lcd_dclk_freq×1000×1000) / (ht×vt)。

Cette valeur est calculée selon la formule suivante :

lcd_dclk_freq=lcd_ht lcd_vt fps

Avis:

  1. Les trois paramètres suivants sont obtenus à partir du manuel de l'écran et le fps est généralement de 60.
  2. S'il s'agit d'une interface série, il faut 2 à 3 cycles pour envoyer un pixel.
lcd_dclk_freq * cycles = lcd_ht*lcd_vt*fps

ou

lcd_dclk_freq = lcd_ht*cycles*lcd_vt*fps
5.2.10 lcd_width

Largeur du panneau LCD en mm

Ce paramètre décrit la largeur physique de l'écran LCD, en mm. Utilisé pour calculer le dpi.

5.2.11 lcd_hauteur

hauteur du panneau LCD en mm

Ce paramètre décrit la hauteur physique de l'écran LCD, en mm. Utilisé pour calculer le dpi.

5.3 Paramètres liés au rétroéclairage

Actuellement, le réglage du rétroéclairage PWM est largement utilisé.Le principe est d'utiliser l'effet de scintillement haute fréquence produit par les commutateurs à impulsions PWM pour tromper l'œil humain et ajuster la luminosité en ajustant le rapport cyclique.

5.3.1 lcd_pwm_used

S'il faut utiliser pwm.

Ce paramètre identifie s'il faut utiliser PWM pour le contrôle de la luminosité du rétroéclairage.

5.3.2 lcd_pwm_ch

Canal PWM utilisé

Ce paramètre identifie le canal Pwm utilisé. Ici, il fait référence au canal Pwm du SoC qui est utilisé. Vous pouvez le connaître en regardant la connexion schématique.

5.3.3 lcd_pwm_freq

Fréquence PWM du rétroéclairage LCD

Ce paramètre configure la fréquence du signal PWM en Hz.

Remarque :
la fréquence ne doit pas être trop basse, sinon le scintillement sera facilement visible et la fréquence ne doit pas être trop rapide, sinon l'effet de réglage du rétroéclairage sera médiocre. Certains manuels d'écran indiqueront la plage de fréquence PWM autorisée, veuillez suivre la plage fixe du manuel d'écran pour les paramètres.
Il est facile de voir un scintillement à faible luminosité, ce qui est un phénomène normal, comme c'est actuellement le cas avec les rétroéclairages PWM.

5.3.4 lcd_pwm_pol

Polarité PWM du rétroéclairage LCD

Ce paramètre configure la polarité du rapport cyclique du signal PWM. La signification correspondante de la définition de la valeur correspondante est :

0:active high
1:active low
5.3.5 lcd_pwm_max_limit

Limite maximale PWM du rétroéclairage Lcd, exprimée en valeur de luminosité

Par exemple, 150 signifie que le rétroéclairage ne peut être réglé que jusqu'à 150 et que la valeur de luminosité comprise entre 0 et 255 sera mappée linéairement sur la plage comprise entre 0 et 150. Utilisé pour contrôler la luminosité maximale du rétroéclairage et économiser la consommation d'énergie.

5.3.6 lcd_bl_fr

Broche d'activation du rétroéclairage, en option, voir s'il y en a une dans le schéma de principe. Elle est utilisée pour activer ou désactiver la tension du circuit de rétroéclairage.

Exemple : lcd_bl_en = port:PD24<1><2><1>

Signification : allumez le rétroéclairage de l'écran LCD lorsque le PD24 émet un niveau élevé ; tirez-le vers le bas, la valeur par défaut est un niveau élevé.

• Le premier crochet angulaire : affectation de fonction : 1 est la sortie ;

• La deuxième équerre : résistance intégrée ; si 0 est utilisé, il indique l'état de haute impédance de la résistance interne, s'il est 1, cela signifie que la résistance interne monte, et s'il est 2, cela signifie que la résistance interne descend. L'utilisation de default représente l'état par défaut, c'est-à-dire que la résistance est allumée

tirer. Les autres données ne sont pas valides.

• Le troisième support angulaire : capacité de conduite ; la capacité de conduite par défaut du tableau est le niveau 1.

• Le quatrième crochet angulaire : niveau ; 0 est un niveau bas, 1 est un niveau haut.

Le pilote d'écran doit appeler l'interface correspondante pour le contrôle marche et arrêt.

illustrer

D'une manière générale, le niveau élevé est activé. Dans ce principe, il est recommandé de régler la résistance interne sur pull-down pour éviter le pull-up provoqué par le matériel, provoquant un allumage précoce du rétroéclairage. Veuillez indiquer le niveau par défaut comme niveau élevé, ce qui correspond à ce que uboot a montré.

Affichage du degré au noyau, fluide et sans scintillement.

5.3.7 lcd_bl_n_percent

Valeur de mappage du rétroéclairage, n est (0-100)

Cette fonction est destinée aux écrans LCD à luminosité non linéaire. Elle ajuste le changement de luminosité en fonction de la courbe de luminosité configurée pour rendre le changement de luminosité plus linéaire.

Par exemple, lcd_bl_50_percent = 60 signifie que la valeur de luminosité de 50 % est ajustée à 60 %, c'est-à-dire que la luminosité est augmentée de 10 % par rapport à la valeur d'origine.

illustrer

Une modification incorrecte de cette propriété peut entraîner un mauvais effet de réglage du rétroéclairage.

5.3.8 lcd_backlight

Valeur par défaut du rétroéclairage, 0-255.

Cet attribut détermine la luminosité lors de l'étape d'affichage du logo dans uboot. Lors de l'entrée dans le noyau, la configuration enregistrée est lue pour déterminer la luminosité.

illustrer

Au stade de l'affichage du logo, d'une manière générale, une luminosité relativement vive est requise, et c'est la pratique dans l'industrie.

5.4 Paramètres liés à l'effet d'affichage

5.4.1 lcd_frm

Modulateur de fréquence d'images LCD

FRM vise à résoudre le problème de profondeur de couleur causé par la réduction du code PIN.

La signification correspondante de ce réglage de paramètre est :

0:RGB888 -- RGB888 direct
1:RGB888 -- RGB666 dither
2:RGB888 -- RGB565 dither

Le format de pixel de certains écrans LCD est une profondeur de couleur de 18 bits (RGB666) ou une profondeur de couleur de 16 bits (RGB565). Il est recommandé d'activer la fonction FRM et de compenser la profondeur de couleur par tramage, de sorte que l'affichage atteigne 24 -profondeur de couleur en bits (RVB888)

Effet. Comme le montre la figure ci-dessous, la figure du haut est un écran LCD avec une profondeur de couleur de RVB66, et la figure du bas est l'affichage après l'activation du tramage. Une fois le tramage activé, le dégradé de couleurs est excessivement lisse.

image-20221130172026584

Figure 5-6 : lcd_frm ouvert

image-20221130172041420

Figure 5-7 : fermeture de lcd_frm
5.4.2 lcd_gamma_fr

Activation de la correction gamma de l'écran LCD

La signification correspondante de la définition de la valeur correspondante est :

0:Lcd的Gamma校正功能关闭
1:Lcd的Gamma校正功能开启

Lorsqu'il est défini sur 1, lcd_gamma_tbl[256] doit être attribué dans le pilote d'écran.

5.4.3 lcd_cmap_fr

Activation de la carte de couleurs Lcd

La signification correspondante de la définition de la valeur correspondante est :

0:Lcd的色彩映射功能关闭
1:Lcd的色彩映射功能开启

Lorsqu'elle est définie sur 1, la table de carte de couleurs Lcd doit être attribuée à lcd_cmap_tbl [2][3][4].

Chaque pixel comporte trois unités : R, V et B. Tous les quatre pixels constituent une sélection, avec un total de 12 options. La première dimension du tableau représente les lignes paires et impaires, la deuxième dimension représente le RVB du pixel et la troisième dimension représente le nombre de pixels.

Le contenu de représente le contenu mappé à l’emplacement.

LCD CMAP est une fonction de sortie de mappage pour les pixels. Seuls les écrans LCD avec des dispositions de pixels spéciales doivent être configurés.

LCD CMAP définit 4 pixels dans chaque ligne comme unité totale, et chaque pixel est divisé en 3 petites unités de R, V et B, pour un total de 12 petites unités. Définissez la relation de mappage via lcd_cmap_tbl, et chaque petite unité de sortie peut être

Il est destiné à être mappé sur l’une des 12 petites unités.

__u32 lcd_cmap_tbl[2][3][4] = {
    {
        {LCD_CMAP_G0,LCD_CMAP_B1,LCD_CMAP_G2,LCD_CMAP_B3},
        {LCD_CMAP_B0,LCD_CMAP_R1,LCD_CMAP_B2,LCD_CMAP_R3},
        {LCD_CMAP_R0,LCD_CMAP_G1,LCD_CMAP_R2,LCD_CMAP_G3},
    },
    {
        {LCD_CMAP_B3,LCD_CMAP_G2,LCD_CMAP_B1,LCD_CMAP_G0},
        {LCD_CMAP_R3,LCD_CMAP_B2,LCD_CMAP_R1,LCD_CMAP_B0},
        {LCD_CMAP_G3,LCD_CMAP_R2,LCD_CMAP_G1,LCD_CMAP_R0},
    },
};

Comme ci-dessus, les trois lignes supérieures représentent la disposition des pixels des lignes impaires, et les trois lignes inférieures représentent la disposition des pixels des lignes paires.

Tous les quatre pixels constituent une unité, la première colonne représente la première carte de pixels tous les quatre pixels, la deuxième colonne représente la deuxième carte de pixels tous les quatre pixels, et ainsi de suite.

Comme défini ci-dessus, le format de sortie des pixels est celui indiqué dans la figure ci-dessous.

image-20221130172721739

Figure 5-8 : cmap
5.4.4 lcd_rb_swap

Remplacez le composant R et le composant B dans le RVB du module tcon.

0:不变
1:调换R分量和B分量

5.5 Paramètres d'alimentation et de broches

5.5.1 Aperçu

Si une certaine alimentation doit être utilisée, elle doit être définie dans le nœud [disp] et la chaîne utilisée dans la partie [lcd] doit être cohérente avec celle définie dans disp. Par exemple, l'exemple suivant :

disp: disp@01000000 {
    disp_init_enable = <1>;
    disp_mode = <0>;
    /* VCC-LCD */
    dc1sw-supply = <&reg_sw>;
    /* VCC-LVDS and VCC-HDMI */
    bldo1-supply = <&reg_bldo1>;
    /* VCC-TV */
    cldo4-supply = <&reg_cldo4>;
};

Parmi eux, -supply est fixe et la chaîne avant -supply est arbitraire, mais il est recommandé de choisir un nom significatif. Le <®_sw> après = doit être trouvé dans le nœud régulateur0 de board.dtsi.

Ensuite dans le nœud lcd0, si vous souhaitez utiliser reg_sw, écrivez-le simplement comme suit, dc1sw correspond à dc1sw-supply.

lcd_power=”dc1sw”

Étant donné que u-boot possède également un pilote axp, un pilote d'affichage et un noyau, ils lisent tous la même configuration. Afin d'être compatibles les uns avec les autres, il existe les restrictions suivantes lors de la dénomination :

Dans u-boot 2018, le pilote axp ne reconnaît que les noms définis dans la puce axp comme bldo1, donc lorsque vous nommez xxxsupply, il est préférable de le nommer selon la définition de la puce axp.

5.5.2 lcd_power

Voir les considérations décrites ci-dessus.

示例:lcd_power = “vcc-lcd”

Configurez le nom du régulateur. Après la configuration, le pilote d'écran doit appeler l'interface correspondante pour le contrôle marche/arrêt.

Remarque : Si plusieurs blocs d'alimentation doivent être allumés, définissez lcd_power1, lcd_power2, etc.

5.5.3 lcd_pin_power

L'utilisation de lcd_power est la même. La différence est qu'une fois que l'utilisateur l'a défini, il n'est pas nécessaire de l'utiliser dans le pilote d'écran. Au lieu de cela, le cadre du pilote l'active avant le pilote d'écran et le désactive après le pilote d'écran.

示例:lcd_pin_power = “vcc-pd”

Remarque : Si plusieurs groupes sont requis, ajoutez lcd_pin_power1, lcd_pin_power2, etc. En plus de lcddx, l'alimentation ici peut également être l'alimentation de la broche correspondant à pwm.

5.5.4 lcd_gpio_0
示例:lcd_gpio_0 = port:PD25<0><0><default><0>

Signification : la broche lcd_gpio_0 est PD25.

• Premier crochet angulaire : affectation des fonctions : 0 est une entrée, 1 est une sortie.

• La deuxième équerre : résistance intégrée ; si 0 est utilisé, il indique l'état de haute impédance de la résistance interne, s'il est 1, cela signifie que la résistance interne monte, et s'il est 2, cela signifie que la résistance interne descend. L'utilisation de default représente l'état par défaut, c'est-à-dire que la résistance est allumée

tirer. Les autres données ne sont pas valides.

• Troisième équerre : capacité d'entraînement ; la capacité d'entraînement de la table par défaut est de niveau 1.

• Le quatrième crochet angulaire : indique la valeur par défaut, c'est-à-dire, lorsqu'il est réglé sur sortie, le niveau de sortie de la broche, 0 est le niveau bas, 1 est le niveau haut.

Le pilote d'écran doit appeler l'interface correspondante pour contrôler le pull-up et le pull-down. Veuillez consulter la description de la fonction de contrôle des broches

Remarque : Si plusieurs broches gpio doivent être contrôlées, définissez lcd_gpio_0, lcd_gpio_1, etc.

5.5.5 lcddx

Exemple : lcdd0 = port:PD00<3><0>

Signification : Cette broche de lcdd0, à savoir PD0, est configurée comme sortie LVDS.

• Le premier crochet angulaire : attribution de fonction ; 0 est l'entrée, 1 est la sortie, 2 est la sortie LCD, 3 est la sortie de l'interface LVDS et 7 est désactivé.

• La deuxième équerre : résistance intégrée ; si 0 est utilisé, il indique l'état de haute impédance de la résistance interne, s'il est 1, cela signifie que la résistance interne monte, et s'il est 2, cela signifie que la résistance interne descend. L'utilisation de default représente l'état par défaut, c'est-à-dire que la résistance est allumée

tirer. Les autres données ne sont pas valides.

• Troisième équerre : capacité d'entraînement ; la capacité d'entraînement de la table par défaut est de niveau 1.

• Le quatrième crochet angulaire : indique la valeur par défaut, c'est-à-dire, lorsqu'il est réglé sur sortie, le niveau de sortie de la broche, 0 est le niveau bas, 1 est le niveau haut.

La configuration du code PIN LCD est la suivante :

Lorsque l'écran LCD est un écran HV RGB ou un écran CPU/I80, le port IO correspondant doit être défini comme sortie LCD (s'il s'agit d'une sortie 0, le premier équerre est 2 ; s'il s'agit d'une sortie 1, le premier équerre est 3) .

Pour une correspondance IO spécifique, veuillez vous référer au manuel d'utilisation pour la configuration.

Tous les IO du code PIN LCD peuvent être indéfinis via des commentaires, et le pilote d'affichage n'initialise pas les IO de commentaires.

Le pilote d'écran doit appeler l'interface correspondante pour le contrôle marche et arrêt.

Remarque : Il n'est pas nécessaire de l'appeler lcdd0. Le changer par un autre nom n'aura aucun impact sur le pilote. Ceci est uniquement pour des raisons de commodité de mémoire.

5.5.6 pinctrl-0 et pinctrl-1

Lors de la configuration du nœud lcd0, lorsque vous devez configurer la réutilisation des broches, il vous suffit d'attribuer pinctrl-0 et pinctrl-1. Vous pouvez utiliser les broches définies à l'avance, ou vous pouvez utiliser vos propres broches définies à l'avance.

Pour trouver la définition dans le répertoire du noyau arch/arm/boot/dts ou arch/arm64/boot/dts : platform-pinctrl.dtsi.

exemple:

pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//休眠时候的定义,io_disable
Tableau 5-1 : Noms de broches définis à l'avance
Nom de la broche décrire
rgb24_pins_a et rgb24_pins_b Interface d'écran RVB, et la largeur des bits de données est de 24, RVB888
rgb18_pins_a et rgb18_pins_b Interface d'écran RVB, et la largeur des bits de données est de 16, RVB666
lvds0_pins_a et lvds0_pins_b Interface LVDS à liaison unique, définition de 0 broches (affichage principal lcd0)
lvds1_pins_a et lvds1_pins_b Interface LVDS à liaison unique, définition à 1 broche (affichage principal lcd0)
lvds2link_pins_a et lvds2link_pins_b Définition des broches de l'interface LVDS à double liaison (écran principal lcd0)
lvds2_pins_a et lvds2_pins_b Interface LVDS à liaison unique, définition de 0 broche (écran principal lcd1)
lvds3_pins_a et lvds3_pins_b Interface LVDS à liaison unique, définition à 1 broche (écran principal lcd1)
lcd1_lvds2link_pins_a et lcd1_lvds2link_pins_b Définition des broches de l'interface LVDS à double liaison (affichage principal LCD1)
dsi4lane_pins_a et dsi4lane_pins_b Définition des broches de l'interface d'écran DSI à 4 voies

Personnaliser un jeu de pieds

Écrit dans board.dtsi, tant que le nom ne répète pas le nom existant, déterminez d'abord si la broche que vous devez utiliser appartient au grand domaine CPU ou au petit domaine CPU, et utilisez-le pour déterminer si la définition de la broche doit être placé dans pio (gros processeur

domaine) ou sous r_pio (domaine petit processeur).

exemple:

&pio {
    I8080_8bit_pins_a: I8080_8bit@0 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
            PD19", "PD20", "PD21";
            allwinner,function = "I8080_8bit";
            allwinner,muxsel = <2>;
            allwinner,drive = <3>;
            allwinner,pull = <0>;
        };
        I8080_8bit_pins_b: I8080_8bit@1 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
            allwinner,function = "I8080_8bit_suspend";
            allwinner,muxsel = <7>;
            allwinner,drive = <3>;
            allwinner,pull = <0>;
    };
};

• broches, broches spécifiques.

• pname, pin name, choisissez-le avec désinvolture.

• fonction, le nom de la fonction pin, choisissez-le avec désinvolture.

• muxsel, sélection de la fonction pin. Sélectionnez la fonction correspondante en fonction des spécifications du port.

• lecteur, capacité du lecteur, plus la valeur est grande, plus la capacité du lecteur est grande.

• Tirez, tirez de haut en bas. Si 0 est utilisé, cela indique que la résistance interne est dans un état de haute impédance. Si c'est 1, cela signifie que la résistance interne monte. Si 2 est utilisé, cela signifie que la résistance interne tire vers le bas. L'utilisation de default représente l'état par défaut, qui est un pull-up de résistance. Autres numéros

Les données sont invalides.

为了规范,我们将在所有平台保持一致的名字,其中后缀为a 为管脚使能,b 的为io_disable 用于设备关闭时。

有时候,你需要用两组不同功能的管脚,可以像下面这样定义即可。

pinctrl-0 = <&rgb24_pins_a>, <&xxx_pins_a>;
pinctrl-1 = <&rgb24_pins_b>, <&xxx_pins_b>;//休眠时候的定义,io_disable

5.6 ESD 静电检测自动恢复功能

这个功能在linux4.9 以及linux 3.10 sunxi-product 分支上实现了,如果需要这个功能,需要完成以下步骤。

首先打开如下内核配置:

image-20221130174114112

图5-9: ESD 内核配置

修改屏驱动,实现三个回调函数:

如下示例,在屏he0801a068 上添加esd 相关的回调函数。
(linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/he0801a068.c)。

image-20221130174231109

图5-10: ESD 屏驱动添加函数

esd_check 函数原型:

S32 esd_check(u32 sel)

作用:是给上层反馈当前屏的状态。

返回值:如果屏正常的话就返回0,不正常的话就返回非0。

sel:显示索引。

由于屏的类型接口众多,不同屏检测屏的状态各异,一般来说是通过驱动接口读取屏的内部信息(id 或者其它寄存器),如果获取正常则认为屏是正常的,获取失

败则认为屏是异常的。比如下面dsi 屏的做法:

image-20221130174303084

图5-11: ESD 屏驱动函数实现

此外,一般情况下,也会通过dsi 接口读取0x0A 命令(获取power 模式)来判断屏是否正常。

sunxi_lcd_dsi_dcs_read(sel, 0x0A, result, &num)

image-20221130174341400

图5-12: ESD MIPI 状态寄存器

reset_panel 函数原型:

s32 reset_panel(u32 sel)

作用:当屏幕异常的时候所需要的复位操作。

返回值:复位成功就是0,复位失败非0。

sel:显示索引。

每个屏的初始化都不同,顺序步骤都不一样,总的来说就是执行部分或者完整的屏驱动里面的close_flow 和open_flow 所定义的回调函数。根据实际情况灵活编写

这个函数。

值得注意的是:某些dsi 屏中,需要至少执行过一次sunxi_lcd_dsi_clk_disable(dsi 高速时钟禁止)和sunxi_lcd_dsi_clk_enable(高速时钟使能),否则可能导致

dsi 的读函数异常。

下图是复位函数示例:

image-20221130174745808

图5-13: ESD 复位函数1

set_esd_info 函数原型:

s32 set_esd_info(struct disp_lcd_esd_info *p_info)

作用:控制esd 检测的具体行为。比如间隔多长时间检测一次,复位的级别,以及检测函数被调用的位置。

返回值:成功设置返回0,否则非0。

p_info:需要设置的esd 行为结构体。

示例:下面图所示,每隔60 次显示中断检测一次(调用esd_check 函数,如果显示帧率是60fps 的话,那么就是1 秒一次),然后将在显示中断处理函数里面执行

检测函数,由esd_check_func_pos 成员决定调用esd_check 函数的位置,如果是0 则在中断之外执行检测函数,之所以有这个选项是因为显示中断资源(中断处

理时间)是非常珍贵的资源,关系到显示帧率的问题。下图中的level 为1 表示复位全志SoC 的LCD 相关模块以及reset_panel 里面的操作,level 为0 的时候表示

仅仅执行reset_panel 里面的操作。

image-20221130174832573

图5-14: ESD 设置信息函数

可以通过cat /sys/class/disp/disp/attr/sys 获取当前的esd info。

screen 0:
de_rate 594000000 hz, ref_fps:60
mgr0: 2560x1600 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] unblank err[0]
force_sync[0]
dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
capture: dis req[0] runing[0] done[0,0]
lcd output(enable) backlight( 50) fps:60.9 esd level(1) freq(300) pos(1)
reset(244) 2560x1600
err:0 skip:0 skip T.O:50 irq:73424 vsync:0 vsync_skip:0
BUF en ch[1] lyr[0] z[0] prem[N] fbd[N] a[globl 255] fmt[ 0] fb
[2560,1600;2560,1600;2560,1600] crop[ 0, 0,2560,1600] frame[ 0, 0,2560,1600]
addr[98100000,00000000,00000000] right[00000000,00000000,00000000] flags[0x00] trd[0,0]
depth[ 0]
acquire: 0, 25.5 fps
release: 0, 25.5 fps
display: 0, 25.5 fps

esd level(1) freq(300) pos(1) reset(244)

esd levele 和freq 和pos 的意思请看上面set_esd_info 函数原型的解释。

Reset 后面的数字表示屏复位的次数(也就是esd 导致屏挂掉之后,并且成功检测到并复位的次数)。

此功能可能遇到的问题。

  1. 打静电挂了,但是读出来的值仍然是正确的,此问题无解。

  2. Dsi 读操作卡住了,卡在中断里面了。此问题可能和DSI 的lp 模式下的速率有关系,而lp 的速率又和dclk 的频率有关系。此时可以尝试修改de_dsi_28.c() 文件

中的dsi_basic_cfg 函数,如下图所示红框所示的寄存器值,这个寄存器是Lp 模式时钟分频值,一般来说这个值越小,lp 速率越快,尝试改小看是否还会卡

住。

image-20221130175036108

图5-15: Lp 模式时钟分频值

6 调试方法

系统起来之后可以读取sysfs 一些信息,来协助调试。

6.1 加快调试速度的方法

很明显,如果你在安卓上调试LCD 屏会比较不方便,安卓编译时间和安卓固件都太过巨大,每次修改内核后,可能都要经过10 几分钟都才能验证,这样效率就太

低下了,可用采用如下方法:

  1. 使用linux 固件而不是安卓固件。SDK 是支持仅仅编译linux 固件,一般是配置lichee 或者longan 的时候选择linux,打包的时候,用lichee 或者longan 根目录

下的build.sh 来打包就行。因为linux 内核小得多,编译更快,更方便调试。

  1. 使用内核来调试LCD 屏。我们知道Uboot 和内核都需要添加LCD 驱动,这样才能快速显示logo,但是uboot 并不方便调试,所以有时候我们需要把uboot 的

显示驱动关掉,专心调试内核的LCD 驱动,调好之后才移植到uboot,另外这样做的一个优点是,我可以非常方便的修改lcd timing 而不需要重烧固件。就是

利用uboot 命令的fdt 命令修改device tree。
比如说:

fdt set lcd0 lcd_hbp <40>

更多命令见fdt help。

如何关闭uboot 显示呢,一般是在uboot 源码路径下inlcude/configs/平台.h 中,注释掉CONFIG_SUNXI_MODULE_DISPLAY 即可,如果是uboot 2018 则是注释

掉configs/平台_defconfig 中CONFIG_DISP2_SUNXI。

6.2 查看显示信息

以下信息是所有信息中最重要的。

cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 297000000 hz, ref_fps:60
mgr0: 1280x800 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0]
unblank direct_show[false]
lcd output backlight( 50) fps:60.9 1280x 800
err:0 skip:31 irq:1942 vsync:0 vsync_skip:0
BUF enable ch[1] lyr[0] z[0] prem[N] a[globl 255] fmt[ 8] fb[1280, 800;1280,
800;1280, 800] crop[ 0, 0,1280, 800] frame[ 0, 0,1280, 800] addr[ 0,
0, 0] flags[0x 0] trd[0,0]

lcd output

表示当前显示接口是LCD 输出。

1280x800

表示当前LCD 的分辨率,与board.dts 中lcd0 的设置一样。

ref_fps:60

是根据你在board.dts的lcd0填的时序算出来的理论值。

fps:60.9

后面的数值是实时统计的,正常来说应该是在60(期望的fps) 附近,如果差太多则不正常,重新检查屏时序,和在屏驱动的初始化序列是否有被调用到。

irq:1942

这是vsync 中断的次数,每加1 都代表刷新了一帧,正常来说是一秒60(期望的fps)次,重复cat sys,如果无变化,则异常。

BUF

开头的表示图层信息,一行BUF 表示一个图层,如果一个BUF 都没有出现,那么将是黑屏,不过和屏驱动本身关系就不大了,应该查看应用层& 框架层。

err:0

这个表示缺数,如果数字很大且一直变化,屏幕会花甚至全黑,全红等。

skip:31

这个表示跳帧的数量,如果这个数值很大且一直变化,有可能卡顿,如果数字与irq 后面的数字一样,说明每一帧都跳,会黑屏(有背光)。

6.3 查看电源信息

查看axp 某一路电源是否有enable 可以通过下面命令查看。当然这个只是软件的,实际还是用万用表量为准。

cat /sys/class/regulator/dump
pmu1736_ldoio2 : disabled 0 700000 supply_name:
pmu1736_ldoio1 : disabled 0 700000 supply_name:
pmu1736_dc1sw : enabled 1 3300000 supply_name: vcc-lcd
pmu1736_cpus : enabled 0 900000 supply_name:
pmu1736_cldo4 : disabled 0 700000 supply_name:
pmu1736_cldo3 : disabled 0 700000 supply_name:
pmu1736_cldo2 : enabled 1 3300000 supply_name: vcc-pf
pmu1736_cldo1 : disabled 0 700000 supply_name:
pmu1736_bldo5 : enabled 2 1800000 supply_name: vcc-cpvin vcc-pc
pmu1736_bldo4 : disabled 0 700000 supply_name:
pmu1736_bldo3 : disabled 0 700000 supply_name:
pmu1736_bldo2 : disabled 0 700000 supply_name:
pmu1736_bldo1 : disabled 0 700000 supply_name:
pmu1736_aldo5 : enabled 0 2500000 supply_name:
pmu1736_aldo4 : enabled 0 3300000 supply_name:
pmu1736_aldo3 : enabled 1 1800000 supply_name: avcc
pmu1736_aldo2 : enabled 0 1800000 supply_name:
pmu1736_aldo1 : disabled 0 700000 supply_name:
pmu1736_rtc : enabled 0 1800000 supply_name:
pmu1736_dcdc6 : disabled 0 500000 supply_name:
pmu1736_dcdc5 : enabled 0 1480000 supply_name:
pmu1736_dcdc4 : enabled 1 900000 supply_name: vdd-sys
pmu1736_dcdc3 : enabled 0 900000 supply_name:
pmu1736_dcdc2 : enabled 0 1160000 supply_name:
pmu1736_dcdc1 : enabled 4 3300000 supply_name: vcc-emmc vcc-io vcc-io vcc-io

6.4 查看pwm 信息

pwm 的用处这里是提供背光电源。

cat /sys/kernel/debug/pwm
platform/7020c00.s_pwm, 1 PWM device
pwm-0 ((null) ): period: 0 ns duty: 0 ns polarity: normal
platform/300a000.pwm, 2 PWM devices
pwm-0 (lcd ): requested enabled period: 20000 ns duty: 3984 ns polarity:
normal
pwm-1 ((null) ): period: 0 ns duty: 0 ns polarity: normal

上面的“requested enabled” 表示请求并且使能了,括号里面的lcd 表示是由lcd 申请的。

6.5 查看管脚信息

cat /sys/kernel/debug/pinctrl/pio/pinmux-pins
pin 227 (PH3): twi1 (GPIO UNCLAIMED) function io_disabled group PH3
pin 228 (PH4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 229 (PH5): (MUX UNCLAIMED) pio:229
pin 230 (PH6): (MUX UNCLAIMED) pio:230
pin 231 (PH7): (MUX UNCLAIMED) pio:231

上面的信息我们知道PH5,PH6 这些IO 被申请为普通GPIO 功能,而PH3 被申请为twi1。

6.6 查看时钟信息

cat /sys/kernel/debug/clk/clk_summary

这个命令可以看哪个时钟是否使能,然后频率是多少。

与显示相关的是tcon,pll_video,mipi 等等。

cat /sys/kernel/debug/clk/clk_summary | grep tcon
cat /sys/kernel/debug/clk/clk_summary | grep pll_video
cat /sys/kernel/debug/clk/clk_summary | grep mipi

6.7 查看接口自带colorbar

显示是一整条链路,中间任何一个环节出错,最终的表现都是显示异常,图像显示异常几个可能

原因:

  1. 图像本身异常。
  2. 图像经过DE(Display Engine)后异常。
  3. 图像经过接口模块后异常。这是我们关注的点。

有一个简单的方法可以初步判断,接口模块(tcon 和dsi 等)可以自己输出内置的一些patten(比如说彩条、灰阶图、棋盘图等),当接口输出这些内置patten

的时候,如果这时候显示就异常,这说明了:

  1. LCD 的驱动或者配置有问题。
  2. LCD 屏由于外部环境导致显示异常。

显示自带patten 的方式:

在linux-4.9 及其以上版本的内核,disp 的sysfs 中有一个attr 可以直接操作显示:

echo X > /sys/class/disp/disp/attr/colorbar

上面的操作是显示colorbar,其中的X 可以是0 到8,对应的含义如下图所示:

image-20221130180522997

图6-1: colorbar

如果有多个显示设备,想让第二个显示设备显示colorbar 的话,那么先:

echo 1 > /sys/class/disp/disp/attr/disp

然后再执行上面操作。

如果没有这个attr 的话,可以直接操作寄存器,也就是操作tcon 寄存器的040 偏移的最低3位。

在linux 下,cd /sys/class/sunxi_dump 然后:

echo 0x06511040 > dump;cat dump

这样会打印当前tcon 的040 偏移寄存器的值,然后在上面值的基础上修改最低3 位为上图的值即可,修改方式示例:

echo 0x06511040 0x800001f1 > write

注意tcon 的基地址不一定是0x06511000,不同平台不一样,请参考SoC 文档获取tcon 的基地址。

6.8 DE 截屏

显示出现异常的时候,有可能是下面三个原因:

  1. SoC 端屏接口模块+LCD 屏出现了问题。
  2. 图像经过SoC 端图像合成模块(DE)处理后出现了问题。
  3. 图像源本身就有问题。
    本节介绍,确认图像源本身没问题的前提下,如何进一步确认是否经过DE 处理之后图像是否有问题。

语法:

echo 屏幕索引> /sys/class/disp/disp/attr/disp
echo 路径/bmp文件名> /sys/class/disp/disp/attr/capture_dump

第一个echo 的作用是确定捕捉哪个显示的,“屏幕索引” 可选取值是0 或者1。

第二个echo 作用是生成截屏bmp 文件,确保“路径” 是可写的,有剩余空间的。

比如:

echo 0 > /sys/class/disp/disp/attr/disp
echo /data/xx.bmp > /sys/class/disp/disp/attr/capture_dump

这样就会在/data 目录下生成screen 0 的bmp 截图,文件名是xx.bmp。

除了bmp 之外,还支持保存raw 数据,包括RGB 和YUV 颜色空间,它们以后缀来区分,用法

如下:

# 截取yuv420p颜色空间的raw数据。
echo /data/xx.yuv420_p > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_uvuv颜色空间的raw数据。
echo /data/xx.yuv420_sp_uvuv > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_vuvu颜色空间的raw数据。
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_vuvu颜色空间的raw数据。
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# 截取argb8888颜色空间的raw数据。
echo /data/xx.argb8888 > /sys/class/disp/disp/attr/capture_dump
# 截取abgr8888颜色空间的raw数据。
echo /data/xx.abgr8888 > /sys/class/disp/disp/attr/capture_dump
# 截取rgb888颜色空间的raw数据。
echo /data/xx.rgb888 > /sys/class/disp/disp/attr/capture_dump
# 截取bgr888颜色空间的raw数据。
echo /data/xx.bgr888 > /sys/class/disp/disp/attr/capture_dump
# 截取rgba8888颜色空间的raw数据。
echo /data/xx.rgba8888 > /sys/class/disp/disp/attr/capture_dump
# 截取bgra8888颜色空间的raw数据。
echo /data/xx.bgra8888 > /sys/class/disp/disp/attr/capture_dump

注意:这个功能只有linux-4.9 以及后续的内核才支持这个功能。

7 FAQ

7.1 屏显示异常

总结过往经验,绝大部分屏显异常都是由于上下电时序和timing 不合理导致。

请看屏时序参数说明和屏驱动分解。

7.2 黑屏-无背光

问题表现:完全黑屏,背光也没有。

有两种可能:

  1. 屏驱动添加失败。驱动没有加载屏驱动,导致背光电源相关函数没有运行到。这个你可以通过调试方法定位下。
  2. pwm 配置和背光电路的问题,pwm 的信息可以看pwm 信息和背光相关参数,另外就是直接测量下硬件测量下相关管脚和电压。

7.3 黑屏-有背光

黑屏但是有背光,可能有多种原因导致,请依次按以下步骤检查:

  1. 没送图层。如果应用没有送任何图层那么表现的现象就是黑屏,通过查看显示信息一小节可以确定有没有送图层。如果确定没有图层,可以通过查看接口自带

colorbar,确认屏能否正常显示。

  1. SoC 端的显示接口模块没有供电。SoC 端模块没有供电自然无法传输视频信号到屏上。一般SoC 端模块供电的axp 名字叫做vcc-lcd,vcc-dsi,vcc33-lcd,

vcc18-dsi 等。

  1. 复位脚没有复位。如果有复位脚,请确保硬件连接正确,确保复位脚的复位操作有放到屏驱动中。

  2. board.dts 中lcd0 有严重错误。第一个是lcd 的timing 太离谱,请严格按照屏手册中的提示来写!参考屏时序参数说明。第二个就是,接口类型搞错,比如接

的DSI 屏,配置却写成LVDS 的。

  1. 屏的初始化命令不对。包括各个步骤先后顺序,延时等,这个时候请找屏厂确认初始化命令。

7.4 闪屏

分为几种:

  1. 屏的整体在闪。

这个最大可能是背光电路的电压不稳定,检查电压。

  1. 屏部分在闪,而且是概率性。

board.dts 中的时序填写不合理。

  1. 屏上由一个矩形区域在闪。

屏极化导致,需要关机放一边再开机则不会。

7.5 条形波纹

有些LCD 屏的像素格式是18bit 色深(RGB666)或16bit 色深(RGB565),建议打开FRM功能,通过dither 的方式弥补色深,使显示达到24bit 色深(RGB888)

的效果。如下图所示,上图是色深为RGB66 的LCD 屏显示,下图是打开dither 后的显示,打开dither 后色彩渐变的地方过度平滑。

设置[lcd0] 的lcd_frm 属性可以改善这种现象。请看lcd_frm解释。

7.6 背光太亮或者太暗

请看背光相关参数。

7.7 重启断电测试屏异常

花屏的第一个原因是fps 过高,超过屏的限制:

FPS 异常是一件非常严重的事情,关系到整个操作系统的稳定,如果fps 过高会造成系统带宽增加,送显流程异常,fps 过高还会造成LCD 屏花屏不稳定,容易造

成LCD 屏损坏,FPS 过低则造成用户体验过差。

  1. 通过查看查看显示信息一节,可以得知现在的实时统计的fps。

  2. 如果fps 离正常值差很多,首先检查board.dts 中[lcd0] 节点,所填信息必须满足下面公式。

lcd_dclk_freq*num_of_pixel_clk=lcd_ht*lcd_vt*fps /1e9

其中,num_of_pixel_clk 通常为1,表示发送一个像素所需要的时钟周期为1 一个,低分辨率的MCU 和串行接口通常需要2 到3 个时钟周期才能发送完一个像素。

如果上面填写没有错,通过查看查看时钟信息一节可以确认下几个主要时钟的频率信息,把这些信息和board.dts 发给维护者进一步分析。

7.8 RGB 接口或者I8080 接口显示抖动有花纹

  1. 改大时钟管脚的管脚驱动能力
    参考lcd_gpio_0一小节和pinctrl-0 和pinctrl-1,修改驱动能力,改大。

还有另外一种写法,比如原来是:

lcdclk = port:PD18<2><0><2><default>

可以改成:

lcdclk = port:PD18<2><0><3><default>
  1. 修改时钟相位,也就是修改lcd_hv_clk_phase。由于发送端和接收端时钟相位的不同导致接收端解错若干位。

7.9 LCD 屏出现极化和残影

何谓液晶极化现象:实际上就是液晶电介质极化。就是在外界电场作用下,电介质内部沿电场方向产生感应偶极矩,在电解质表明出现极化电荷的现象叫做电介质

的极化。

通俗的讲就是在液晶面板施加一定电压后,会聚集大量电荷,当电压消失的时候,这些聚集的电荷也要释放,但由于介电效应,这些聚集的电荷不会立刻释放消

失,这些不会马上消失的惰性电荷造成了液晶的DC 残留从而形成了极化现象。

几种常见的液晶极化现象

  1. 液晶长期静止某个画面的时候,切换到灰阶画面的时候出现屏闪,屏闪一段时间后消失。这种现象属于残留电荷放电的过程。

  2. 液晶长期静止某个画面的时候,出现四周发黑中间发白的现象,业内称为黑白电视框异常。

  3. 非法关机的时候,重新上电会出现屏闪,屏闪一定时间后消失。与第一种原因相同。

  4. 残影现象:当液晶静止在一个画面比较久的情况下,切换其他画面出现的镜像残留。残影的本质来说是液晶DC 残留电荷导致,某种意义来说也属于液晶极化

现象。

针对液晶屏出现极化和残影现象,有如下对策。

  1. 调整vcom 电压大小。
    VCOM 是液晶分子偏转的参考电压,要求要稳定,对液晶显示有直接影响,具体的屏不同的话也是不同的。电压的具体值是根据输入的数据以及Vcom 电压大

小来确定的,用来显示各种不同灰阶,也就是实现彩色显示GAMMA。Gamma 电压是用来控制显示器的灰阶的,一般情况下分为G0~G14,不同的Gamma

电压与Vcom 电压之间的压差造成液晶旋转角度不同从而形成亮度的差异,Vcom 电压最好的状况是位于G0 和G14 的中间值,这样液晶屏的闪烁状况会最

好。

调节vcom 电压的方式,如果屏管脚有vcom 管脚,直接调整相关电路,如果屏driver IC 提供寄存器接口,可以通过寄存器接口来调整大小。

  1. 严格按照屏规定的上下电时序来对屏进行开关屏。许多极化残影现象并非长时间显示静止显示某个画面导致的,而是由于关机或者关屏时没有严格按照下电时

序导致的,比如该关的电没关,或者延时不够。

8 总结

Le débogage de l'écran LCD est en fait un processus de débogage de la puce émettrice (Allwinner SoC) et de la puce réceptrice (IC pilote sur l'écran LCD) :

  1. Pour ajouter un pilote d'écran, veuillez consulter les étapes pour ajouter un pilote d'écran et les instructions du pilote d'écran.
  2. Lisez attentivement le manuel de l'écran et le manuel du pilote IC.
  3. Lisez attentivement la description des paramètres matériels.
  4. Assurez-vous que toutes les broches d'alimentation requises par l'écran LCD sont normales.

Je suppose que tu aimes

Origine blog.csdn.net/thisway_diy/article/details/128458756
conseillé
Classement