lcd驱动(soc厂家已经做好,只需要配置设备树)

       lcd的配置,一般有控制器的数据总线组成,soc厂家已经将这部分的驱动写好了,我们只需要配置设备树就可以了,根据自己lcd显示屏幕的参数进行配置。还有一个操作就是如何通过tty操作lcd的驱动。如何将自己的显示器配置为shell的命令终端。

一、设备树配置操作

        lcd的设备驱动如下所示:

        ①、初始化 I.MX6U eLCDIF 控制器,重点是 LCD 屏幕宽 (width) 、高 (height) hspw、 hbp、 hfp vspw vbp vfp 等信息。
        ②、初始化 LCD 像素时钟。
        ③、设置 RGBLCD 显存。
        ④、应用程序直接通过操作显存来操作 LCD ,实现在 LCD 上显示字符、图片等信息。
        Framebuffer 翻译过来就是帧缓冲,简称 fb ,因此大家在以后的 Linux 学习中见到“ Framebuffer ”或者“ fb ”的话第一反应应该想到 RGBLCD或者显示设备。
        不同分辨率的 LCD 屏幕其 eLCDIF 控制器驱动代码都是一样的,只需要修改好对应的屏
幕参数即可。

(1)“imx6ull.dtsi”中父节点lcdif

1 lcdif: lcdif@021c8000 {
2 compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";
3 reg = <0x021c8000 0x4000>;
4 interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
5 clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,
6 <&clks IMX6UL_CLK_LCDIF_APB>,
7 <&clks IMX6UL_CLK_DUMMY>;
8 clock-names = "pix", "axi", "disp_axi";
9 status = "disabled";
10 };

(2)lcd的pinctl引脚,可以根据实际电路修改

        下面是lcd的数据总线的pinctl的配置。后面配置参数“0x79”,是引脚的驱动强度,可以根据实际情况进行修改,可以查imx6ull的数据手册,进行对应的修改。
1 pinctrl_lcdif_dat: lcdifdatgrp {
2     fsl,pins = <
3          MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x79
4          MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x79
5          MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x79
6          MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x79
7          MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x79
8          MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x79
9          MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x79
10         MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x79
11         MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x79
12         MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x79
13         MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x79
14         MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x79
15         MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x79
16         MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x79
17         MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x79
18         MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x79
19         MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x79
20         MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x79
21         MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x79
22         MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x79
23         MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x79
24         MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x79
25         MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x79
26         MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x79
27     >;
28 };

        下面是lcd的pinctl的控制和pwm背光引脚。同样“0x79”是引脚的驱动强度,0x49是最低的驱动强度。

30 pinctrl_lcdif_ctrl: lcdifctrlgrp {
31     fsl,pins = <
32             MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x79
33             MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x79
34             MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x79
35             MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x79
36         >;
37 pinctrl_pwm1: pwm1grp {
38     fsl,pins = <
39         MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0
40     >;
41 };

(3)lcd的clent端的设备树(重要,主要修改这里)

        根据不同的lcd设备,修改设备树的部分,主要就是修改此部分。

1 &lcdif {
2      pinctrl-names = "default";
3      pinctrl-0 = <&pinctrl_lcdif_dat /* 使用到的 IO */
4                   &pinctrl_lcdif_ctrl
5                   &pinctrl_lcdif_reset>;
6      display = <&display0>;
7      status = "okay";
8 
9      display0: display { /* LCD 属性信息 */
10         bits-per-pixel = <16>; /* 一个像素占用几个 bit  888(565) */
11         bus-width = <24>; /* 总线宽度 */
12
13     display-timings {
14         native-mode = <&timing0>; /* 时序信息 */
15         timing0: timing0 { 
16             clock-frequency = <9200000>; /* LCD 像素时钟,单位 Hz */
17             hactive = <480>; /* LCD X 轴像素个数 */
18             vactive = <272>; /* LCD Y 轴像素个数 */
19             hfront-porch = <8>; /* LCD hfp 参数 */
20             hback-porch = <4>; /* LCD hbp 参数 */
21             hsync-len = <41>; /* LCD hspw 参数 */
22             vback-porch = <2>; /* LCD vbp 参数 */
23             vfront-porch = <4>; /* LCD vfp 参数 */
24             vsync-len = <10>; /* LCD vspw 参数 */
25
26             hsync-active = <0>; /* hsync 数据线极性 */
27             vsync-active = <0>; /* vsync 数据线极性 */
28             de-active = <1>; /* de 数据线极性 */
29             pixelclk-active = <0>; /* clk 数据线先极性 */
30         };
31     };
32 };
33 };

(3)pwm背光的client端的修改

        pwm控制器的父节点:

1 pwm1: pwm@02080000 {
2     compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
3     reg = <0x02080000 0x4000>;
4     interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
5     clocks = <&clks IMX6UL_CLK_PWM1>,
6     <&clks IMX6UL_CLK_PWM1>;
7     clock-names = "ipg", "per";
8     #pwm-cells = <2>;
9 };

          用户client端追加的节点:(根据自己的实际情况进行修改)

1 &pwm1 {
2     pinctrl-names = "default";
3     pinctrl-0 = <&pinctrl_pwm1>;
4     status = "okay";
5 };

上面设备树修改完成之后,设备树更新到开发板,就可以使用lcd了。

二、lcd作为虚拟中断的操作

(1)使用tty体系操作lcd的驱动fb

        使用下面的指令,操作tty0终端,tty0会操作lcd的驱动fb0。

echo hello >/dev/tty1

         此时lcd显示屏上已经显示“hello”。

(2)将lcd屏幕作为shell终端

        首先修改uboot的console终端的配置,命令如下所示:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

        然后退出uboot:

boot

        修改/etc/inittab文件,如下所示:(添加)

tty1::askfirst:-/bin/sh

 然后重启开发板,lcd显示屏上就会提示:

Please press Enter to activate this console.

此时按下键盘的回车键或者开发板的复位键就可以使用lcd终端了,不使用的时候,改回uboot,在修改了/etc/inittab文件就可以了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RK3308 SoC 支持SDIO接口,可以通过SDIO接口连接SD卡。下面是SDIO SD卡设备树配置驱动配置的步骤: 1. 设备树配置设备树中添加SDIO节点,配置SDIO相关的属性。例如: ``` sdmmc: sdmmc@ff140000 { compatible = "rockchip,rk3308-sdmmc"; reg = <0x0 0xff140000 0x0 0x10000>; interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru SCLK_SDMMC>; clock-names = "clk_sdmmc"; pinctrl-names = "default", "sleep"; pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4 &sdmmc_bus8>; pinctrl-1 = <&sdmmc_clk_sleep &sdmmc_cmd_sleep &sdmmc_bus4_sleep &sdmmc_bus8_sleep>; bus-width = <4>; status = "okay"; }; ``` 其中,`compatible`属性是设备树中的兼容性属性,`reg`属性是SDIO控制器的寄存器地址和大小,`interrupts`属性是中断号,`clocks`属性是时钟节点,`pinctrl-names`和`pinctrl-0`属性是管脚配置,`bus-width`属性是总线宽度,`status`属性是设备状态,这里设置为"okay"表示设备可用。 2. 驱动配置 在内核中添加SDIO驱动,并配置SDIO控制器和SD卡之间的通信。例如: ``` static struct sdhci_pltfm_data rk3308_sdhci_pdata = { .ops = &rk3308_sdhci_ops, .clk = RK3308_SDMMC_CLK, .cd_gpio = -1, .cd_inverted = true, }; static const struct sdhci_ops rk3308_sdhci_ops = { .set_clock = rk3308_sdhci_set_clock, .set_bus_width = rk3308_sdhci_set_bus_width, .set_uhs_signaling = rk3308_sdhci_set_uhs_signaling, .send_command = rk3308_sdhci_send_command, .reset = rk3308_sdhci_reset, .get_ro = rk3308_sdhci_get_ro, }; static const struct of_device_id rk3308_sdhci_of_match[] = { { .compatible = "rockchip,rk3308-sdmmc" }, {} }; MODULE_DEVICE_TABLE(of, rk3308_sdhci_of_match); static struct platform_driver rk3308_sdhci_driver = { .driver = { .name = "rk3308-sdhci", .of_match_table = rk3308_sdhci_of_match, }, .probe = rk3308_sdhci_probe, .remove = rk3308_sdhci_remove, }; static int __init rk3308_sdhci_init(void) { return platform_driver_register(&rk3308_sdhci_driver); } static void __exit rk3308_sdhci_exit(void) { platform_driver_unregister(&rk3308_sdhci_driver); } module_init(rk3308_sdhci_init); module_exit(rk3308_sdhci_exit); ``` 其中,`sdhci_pltfm_data`结构体是SDHCI平台数据,`sdhci_ops`结构体是SDHCI操作函数,`of_device_id`结构体是设备树匹配信息,`platform_driver`结构体是平台驱动,`rk3308_sdhci_init`和`rk3308_sdhci_exit`是驱动初始化和卸载函数。具体实现可以参考内核源码中的SDHCI驱动实现。 以上是SDIO SD卡设备树配置驱动配置的基本步骤,需要根据具体的系统和硬件进行适当调整和修

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值