一、首先,設定背光:
(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