编程_配置时钟_基于IMX6ULL

编程_配置时钟_基于IMX6ULL




参考资料

内核自带的IMX6ULL LCD驱动程序

  • 驱动源码:Linux-4.9.88\drivers\video\fbdev\mxsfb.c
  • 设备树:
    • arch/arm/boot/dts/imx6ull.dtsi
    • arch/arm/boot/dts/100ask_imx6ull-14x14.dts

1. 硬件相关的操作

LCD驱动程序的核心就是:

  • 分配fb_info
  • 设置fb_info
  • 注册fb_info
  • 硬件相关的设置

硬件相关的设置又可以分为3部分:

  • 引脚设置
  • 时钟设置
  • LCD控制器设置

2. 分析内核自带的驱动程序

2.1 芯片手册

在这里插入图片描述

2.2 设备树

参考:arch/arm/boot/dts/imx6ull.dtsi

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

定义了3个时钟:

  • pix:Pixel clock,用于LCD接口,设置为LCD手册上的参数
  • axi:AXI clock,用于传输数据、读写寄存器,使能即可
  • disp_axi:一个虚拟的时钟,可以不用设置

2.3 代码

  • 获得时钟

    	host->clk_pix = devm_clk_get(&host->pdev->dev, "pix");
    	if (IS_ERR(host->clk_pix)) {
    		host->clk_pix = NULL;
    		ret = PTR_ERR(host->clk_pix);
    		goto fb_release;
    	}
    
    	host->clk_axi = devm_clk_get(&host->pdev->dev, "axi");
    	if (IS_ERR(host->clk_axi)) {
    		host->clk_axi = NULL;
    		ret = PTR_ERR(host->clk_axi);
    		dev_err(&pdev->dev, "Failed to get axi clock: %d\n", ret);
    		goto fb_release;
    	}
    
    	host->clk_disp_axi = devm_clk_get(&host->pdev->dev, "disp_axi");
    	if (IS_ERR(host->clk_disp_axi)) {
    		host->clk_disp_axi = NULL;
    		ret = PTR_ERR(host->clk_disp_axi);
    		dev_err(&pdev->dev, "Failed to get disp_axi clock: %d\n", ret);
    		goto fb_release;
    	}
    
  • 设置频率:只需要设置pixel clock的频率

    		ret = clk_set_rate(host->clk_pix,
    				PICOS2KHZ(fb_info->var.pixclock) * 1000U);
    
  • 使能时钟

    		clk_enable_pix(host);
    			clk_prepare_enable(host->clk_pix);
    		clk_enable_axi(host);
    			clk_prepare_enable(host->clk_axi);
    		clk_enable_disp_axi(host);
    			clk_prepare_enable(host->clk_disp_axi);
    


致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值