RK3288 添加backlight lcd接口

一、首先,設置背光:

(1)添加設備樹節點:

compatible:驅動匹配名稱;

pwm:<pwm選擇 通道選擇 頻率>;

brightness-levels:背光調節等級;

default-bightness-level:默認等級;

enable-gpios:使能引腳;

使能pwm通道。

(2)驅動流程分析:

驅動文件位置:/kernel/driver/video/backlight/pwm_bl.c

pwm_backlight_probe        探測函數

    pwm_backlight_parse_dt       解析設備樹中brightness-levels,default-brightness-level,enable-gpios

    gpio_request_one        申請enable-gpios

    devm_pwm_get        申請pwm,添加到已申請列表

        pwm_get        申請pwm

            of_pwm_get        從設備樹中查找節點

                of_parse_phandle_with_args        解析設備樹中選擇的pwm0節點

                of_node_to_pwmchip        從鏈表中查找

                pc->of_xlate        生成pwm結構

        pwm_request        申請pwm,驅動之間不可重複使用

    pwm_get_period        獲取pwm週期

    dev_set_name        設置設備節點

    backlight_device_register       註冊背光設備

    backlight_update_status        默認值設置背光

        bd->ops->update_status(pwm_backlight_update_status)        同時被ops調用

            compute_duty_cycle        計算佔空比

            pwm_config        配置pwm

            pwm_backlight_power_on        使能backlight

二、設置lcd:

(1)/kernel/arch/arm/configs/firefly_defconfig配置

CONFIG_LCD_MIPI=y

CONFIG_MIPI_DSI=y

CONFIG_RK32_MIPI_DSI=y

(2)設備樹配置

在lcdc0中添加子節點power_ctr(可刪減):

lcd_en:電源使能

lcd_cs:片選信號

lcd_rst:復位信號

mipi host配置

screen-init:液晶屏是否需要初始化,1是,0否;

dsi_lane:每個mipi的傳輸線數量;

dsi_hs_clk:一條lane傳輸速率,Mbits/s,大概100+H_total*V_total*fps*3*8/lanes,H_total V_total是active、bp、fp、sync_len總和;

mipi_dsi_num:單mipi1,雙mipi2;

配置液晶屏初始化序列(根據以上screen-init,無需添加):

cmd_debug:是否打開調試;

cmd_type:LPDT低電位 HSDT高電位;

dsi_id:選擇mipi通道,mipi0 0,mipi1 1,mipi0+mipi1 2;

cmd:初始化命令,<命令類型 指令 參數>,命令類型:0x05 指令無參,0x15 指令一個參,0x39 指令多參;

cmd_delay:指令發後延時;

液晶顯示屏時序配置:

native-mode:選擇時序;

(可參考/kernel/include/dt-bindings/rkfb/rk_fb.h)

screen-type:屏幕類型;

lvds-format:lvds數據格式;

out-face:屏幕接線格式;

clock-frequency:dclk頻率;

hactive:水平有效像素;

vactive:垂直有效像素;

hback-porch/hfront-porch/hsync-len:水平同步信號;

vback-porch/vfront-porch/vsync-len:垂直同步信號;

hsync-active/vsync-active/de-active/pixelclk-active:hync、vsync、DEN、dclk極性控制,1翻轉;

swap-rb/swap-rg/swap-gb:1對顏色翻轉;

使能mipi的host。

(2)驅動流程分析:

    //mipi dsi接口相關信息初始化
rk_mipi_screen_init    ->    lcd_mipi.c
    platform_driver_probe ->    //name是rk_mipi_screen
        rk_mipi_screen_probe  ->
            rk_mipi_screen_init_dt    //讀取mipi信息, lane number, power, gpio, sceen on cmds.//fb相關信息讀取
rk_fb_init ->    rk_fb.c
    platform_driver_register ->    //name: "rockchip,rk-fb"
        rk_fb_probe ->    //獲取disp-mode, u-boot-logo-on等參數。
            rockchip_ion_client_create    //創建ion client。
        //timing參數初始化
//不管是那種接口類型的lcd,lcd的時序參數都是要讀取的.
rk_screen_init ->    rk_screen.c
    platform_driver_register ->    //name: "rk-screen"
        rk_screen_probe ->
            rk_fb_prase_timing_dt ->    //讀取來的配置存在結構體變量rk_screen中.
                of_get_display_timing    //獲取時序參數,dts中可以配置多組,這裏會循環讀取。
                display_timings_get    //根據當前native-mode來選取當前使用哪組時序參數。
                rk_fb_video_mode_from_timing    //把timing轉換到fb video mode中去供後續使用。//mipi dsi controller初始化
//如果是另外的接口那就調用相應的接口控制器驅動來初始化.
rk32_mipi_dsi_init ->    rk32_mipi_dsi.c
    platform_driver_register ->    //name: "rk32-mipi"
        rk32_mipi_dsi_probe ->    //初始化struct dsi結構,包括clock, dsi ops, rk_screen傳遞過來的參數,
            rk_fb_get_prmry_screen    //獲取在之前rk_screen_probe()中初始化的rk_screen變量.
            rk_mipi_dsi_probe ->
                register_dsi_ops    //dsi->ops給dsi_ops
                dsi_probe_current_chip    //檢車dsi chip是否存在.
            rk_fb_trsm_ops_register        //註冊trsm_mipi_ops爲trsm_dsi_ops//lcdc控制器註冊:
rk3288_lcdc_module_init ->    rk3288_lcdc.c
    platform_driver_register ->    //name: "rk3288-lcdc"
        rk3288_lcdc_probe ->
            rk3288_lcdc_parse_dt    //讀取lcdc控制器的參數
            dev_drv->ops = &lcdc_drv_ops;    //lcdc對應ops
            devm_request_irq    //lcdc對應irq是rk3288_lcdc_isr()
            rk_fb_register    -> //對應ops是lcdc_drv_ops
                init_lcdc_device_driver ->
                    init_lcdc_win    //一個lcdc能支持4層win.
                    rk_disp_pwr_ctr_parse_dt    //解析lcdc power ctrl相關內容。
                    rk_fb_set_prmry_screen
                    rk_fb_trsm_ops_get    //根據不同的屏幕類型選擇對應的ops.
                framebuffer_alloc    //系統根據win的多少來創建相應數量的fb
                fbi->fbops = &fb_ops;    //fb ops
                rkfb_create_sysfs    //生成到/dev/graphics/fbx/下
                register_framebuffer
                rkfb_create_sysfs    
                //以下code只跑一次
                kthread_run    //創建rk_fb_wait_for_vsync_thread
                dev_drv->ops->post_dspbuf    //show logo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章