imx6ull的时钟设置
- axi时钟
- pixel时钟
bus clock来自apb_clk,display clock来自pix_clk
BUS CLOCK用来给芯片提供时钟,DISPLAY CLOCK用来给LCD提供时钟。
使用设备树设置时钟
在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>, //pix_clk
<&clks IMX6UL_CLK_LCDIF_APB>, //apb_clk
<&clks IMX6UL_CLK_DUMMY>; //虚拟时钟,6ull不需要这个时钟。但是别的可能需要
clock-names = "pix", "axi", "disp_axi"; //依次对应名字,在代码中用名字获得
status = "disabled";
};
所以如果要改设置树的时钟接口的话,就该这几个就好了
驱动中配置时钟
- axi clock只需要使能就够了
- pix clock需要自己设置
-
获得时钟
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);