1. 程式人生 > >imx6背光驅動調試

imx6背光驅動調試

註意 實參 sdn 獲取 kobject ont eve ini bject

1.內核配置pwm背光驅動
make menuconfig:
Device Driver --->
Graphics support --->
[*] Backlight & LCD device support --->
<*> Lowlevel Backlight controls
<*> Generic PWM based Backlight Driver

2.背光sys文件節點/sys/class/backlight/的由來
在drivers/video/backlight/backlight.c中backlight_class_init()函數中class_create(THIS_MODULE, "backlight")中創建的, 那麽剩下的/sys/class/backlight/backlight.27/brightness又是怎麽來的呢?我們可以看到在drivers/video/backlight/pwm_bl.c中有backlight_device_register(dev_name(&pdev->dev), &pdev->dev, pb, &pwm_backlight_ops, &props), 這個註冊函數接口在/sys/class/backlight/下又創建了一個設備接口, 名字是通過dev_name(&pdev->dev)實參傳遞的. 那麽dev_name(&pdev->dev)是怎樣的呢?

static inline const char *dev_name(const struct device *dev)
{
/* Use the init name until the kobject becomes available */
if (dev->init_name)
return dev->init_name;

return kobject_name(&dev->kobj);
}
由此可知, 如果dev的init_name成員不為空, 則dev_name就是dev的init_name成員值, 否則dev_name就是kobject_name(&dev->kobj), 官方驅動中dev的init_name為空, 所有dev_name為kobject_name(&dev->kobj), 這個會是隨機值, 會產生/sys/class/backlight/backlight.27/...等目錄, 或產生/sys/class/backlight/backlight.16/...等目錄, 現在項目中我需要固定這個目錄為/sys/class/backlight/hud-lcd-backlight/..., 所以我可以給dev的init_name賦值, 這樣就可以產生我們想要的目錄了, 在drivers/video/backlight/pwm_bl.c文件probe函數中backlight_device_register函數前增加dev_set_name(&pdev->dev, "%s", "hud-lcd-backlight");即可實現

3.背光驅動源碼分析driver/video/backlight/pwm_bl.c
3.1通過compitable = "pwm-backlight";匹配到設備樹上arch/arm/boot/dts/imx6dl-hud.dtsi的pwm-backlight設備
3.2進入到探測函數pwm_backlight_probe, 由於backlight設備是采用設備樹, 所以data = dev_get_platdata(&pdev->dev), data = NULL, 所以會進入到pwm_backlight_parse_dt函數
3.3進入到pwm_backlight_parse_dt(&pdev->dev, &defdata)函數,解析設備樹的設備值, 其實就是把設備樹的值(pdev->dev)解析賦值給defdata, 其中prop = of_find_property(node, "brightness-levels", &length);

該函數讀取設備數結點中"brightness-levels"屬性,並把讀取的值放到length中去,這裏length = 32,因為每一個bright-levels的元素(0 4 8 16 32 64 128 255)占4個字節, 共8個元素(0 4 8 16 32 64 128 255)所有共占32字節, 所以length = 32
3.4data = &defdata把解析好的數據defdata賦值給data
3.5data->init = NULL
3.6devm_regulator_get(&pdev->dev, "power"); 由於沒有power節點, 所以會返回錯誤(backlight.27 supply power not found, using dummy regulator)
3.7devm_pwm_get()獲取pwm
3.8註意這裏backlight_device_register(dev_name(&dev->dev), &pdev->dev, pb, &pwm_backlight_ops, &props);通過這個註冊函數接口就創建了/sys/class/backlight/目錄下相應的brightness, max_brightness等屬性(通過backlight_device_register()函數中memcpy()實現)

4.背光驅動IC(U8 SC44ATETRT)與imx6接口控制有3個信號
LCD_BL_EN:背光驅動IC使能
LCD_BL_FFLAG:背光驅動IC電源失效檢測信號, 正常是低電平
LCD_BL_PWM:背光驅動IC pwm控制
4.1LCD_BL_EN
對應原理圖中的NANDF_CS2 pad
需要配置成gpio模式 對應gpio為GPIO6_IO15(MX6QDL_PAD_NANDF_CS2__GPIO6_IO15)
4.2LCD_BL_FFLAG
對應原理圖中的NANDF_CLE pad
需要配置成gpio模式 對應gpio為GPIO6_IO07(MX6QDL_PAD_NANDF_CLE__GPIO6_IO07)
4.3LCD_BL_PWM
對應原理圖中的SD1_DAT2 pad
需要配置成pwm模式 對應的是pwm2輸出(MX6QDL_PAD_SD1_DAT2__PWM2_OUT),在arch/arm/boot/dts/imx6dl-hud.dtsi設備樹要配置
可以在該文件搜索pwm,所有配置如pwm所示

5.SYS_12V_EN
對應原理圖U4電源管理ic的使能腳 對應SD1_DAT0 pad
需要配置成gpio模式 對應gpio為GPIO1_IO16
這個使能後才能給背光驅動IC供電

6.imx6qdl上的背光驅動設備樹分析
imx6q設備樹上的pwm背光驅動描述如下,各節點的具體含義可參考http://blog.csdn.net/mike8825/article/details/51656400
pwm-backlight {
compatible = "pwm-backlight";
pwms = <&pwm2 0 50000>;
brightness-levels = <0 4 8 16 32 64 128 255>;
default-brightness-level = <7>;
status = "okay";
};


&pwm2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm2>;
status = "okay";
};


pinctrl_pwm2: pwm2grp {
fsl,pins = <
MX6QDL_PAD_SD1_DAT2__PWM2_OUT 0x1b0b1
>;
};

參考http://blog.csdn.net/wilsonboliu/article/details/14170135

imx6背光驅動調試