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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值