[迅为开发板资料分享]iTOP-4412开发板LCD的屏幕驱动

大家好今天我们来讲一下 iTOP-4412 开发板 LCD 的屏幕驱动, iTOP-4412 开发板支持 4.3 寸, 7 寸, 9.7寸的 lcd 显示屏。其中 4.3 寸屏是用的 cpu 直接出来的 RGB 信号,7 寸屏和 9.7 寸屏是用的 LVDS 信号,硬件 上 使 用 了 一 个 RGB 转 LVDS 的 芯 片 实 现 的 。 我 们 来 看 下 显 示 驱 动 , 显 示 驱 动 在 内 核 的“drivers/video/samsung” 目录下面, 这个驱动是三星提供好的, 我们这支只讲下我们需要修改的几个文件。

首先是关于屏幕的分辨率的修改,因为不同的屏幕分辨率,频率以及其他一些硬件参数是不同的,所以我们需要根据这些参数去配置 cpu 的显示控制器, 关于这些参数是在 “driversvideo/samsung/s3cfb_wa101s.c”这个文件,打开这个文件我们可以看到这个文件主要就是定义了一个类型是 s3cfb_lcd 的变量 wa101,屏幕的硬件参数(分辨率,时钟频率以及其它)就是保存在这个变量里面,现在我们来看下这个变量结构类型的定义:

struct s3cfb_lcd {

int width;

int height;

int bpp;

int freq;

struct s3cfb_lcd_timing timing;

struct s3cfb_lcd_polarity polarity;

void (*init_ldi)(void);

void (*deinit_ldi)(void);

};

其中的 width 和 height 指屏幕的分辨率,freq 是时钟频率,bpp 是数据位。timing 是屏幕的其他一些参数,

timing 的类型定义如下:

struct s3cfb_lcd_timing {

int h_fp;

int h_bp;

int h_sw;

int v_fp;

int v_fpe;

int v_bp;

int v_bpe;

int v_sw;

};

这个结构代表屏幕的左间距,右间距,水平同步信号宽度,垂直同步信号的有效行数等屏幕的硬件参数,这些

参数可以通过查看屏幕的数据手册获得。

下面是 polarity 变量,他的定义如下:

struct s3cfb_lcd_polarity {

int rise_vclk;

int inv_hsync;

int inv_vsync;

int inv_vden;

};

这个变量代表时钟行场的极性。

通过修改这个文件里面的这些参数就可以设置 cpu 的显示控制器来支持我们使用的 lcd 屏幕了。

iTIO-4412 开发板内核启动时 LCD 会显示 logo,关于这个 logo 是保存在“drivers/video/samsung/

iTop-4412.h”文件,打开这个文件,会看到里面指示定义了一个数组 iBitmapData_q,这个数组的内容就是

要显示的 logo。我们修改 logo,就需要准备一张 480x640 的 bmp 图片然后使用 Image2LCD 软件转换成

数组,把 iBitmapData_q 里面的内容用新生成的数组替换掉。

有 可 能 我 们 自 己 制 作 的 logo 没 有 显 示 在 屏 幕 的 最 中 央 , 那 我 们 需 要 修 改 下 文 件

“drivers/video/samsung/ s3cfb_ops.c” ,在这个文件找到函数:s3cfb_draw_logo

int s3cfb_draw_logo(struct fb_info *fb)

{

#ifdef CONFIG_FB_S5P_SPLASH_SCREEN

struct fb_fix_screeninfo *fix = &fb->fix;

struct fb_var_screeninfo *var = &fb->var;

#if 0

struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev);

memcpy(fbdev->fb[pdata->default_win]->screen_base,

LOGO_RGB24, fix->line_length * var->yres);

#else

//u32 height = var->yres / 3;

u32 line = fix->line_length;

u32 i, j

u32 index;

u32 top,left;

const unsigned char *pLog =NULL;

memset(fb->screen_base, 0x00, var->yres * line);

printk("\n CPU type: \n");

if(soc_is_exynos4412()){

printk(" Exynos 4412\n");

pLog = iBitmapData_q;

}else{

printk("Exynos 4212\n");

pLog = iBitmapData;

}

top = 170;

left = 230;

index = 0;

for (i = 0; i < 480; i++) {

for (j = 0; j < 640; j++) {

memset(fb->screen_base + (i + top) * line + (j + left) * 4 + 0, pLog[index], 1);//B

memset(fb->screen_base + (i + top) * line + (j + left) * 4 + 1, pLog[index+1], 1);//G

memset(fb->screen_base + (i + top) * line + (j + left) * 4 + 2, pLog[index+2], 1);//R

memset(fb->screen_base + (i + top) * line + (j + left) * 4 + 3, 0x00, 1);

index += 3;

}

}

#endif

#endif

return 0;

}

修改这个函数里面的 top 和 left 就可以控制图片在屏幕显示的位置了。

下面我们来看一下 lcd 的控制文件:arch/arm/mach-exynos/setup-fb-s5p.c

在这个文件的 s3cfb_cfg_gpio 函数完成 LCD 数据引脚初始化, 驱动能力设为最高 S5P_GPIO_DRVSTR_LV4;

管脚驱动能力,S5P_GPIO_DRVSTR_LV1-4 四个等级选择,并且设置 LVDS 芯片的使能引脚输出高:

void s3cfb_cfg_gpio(struct platform_device *pdev)

{

int err;

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF0(0), 8, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF1(0), 8, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF2(0), 8, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

s3cfb_gpio_setup_24bpp(EXYNOS4_GPF3(0), 4, S3C_GPIO_SFN(2), S5P_GPIO_DRVSTR_LV4);

#if 1 // TC4

//LVDS_PWDN

err = gpio_request(EXYNOS4_GPL1(0), "GPL1_0");

if (err) {

printk(KERN_ERR "failed to request GPL1 for "

"lcd power control\n");

return err;

}

gpio_direction_output(EXYNOS4_GPL1(0), 1);

s3c_gpio_cfgpin(EXYNOS4_GPL1(0), S3C_GPIO_OUTPUT);

gpio_free(EXYNOS4_GPL1(0));

#endif

}

然后是时钟控制函数,完成时钟的使能和关闭:

int s3cfb_clk_on(struct platform_device *pdev, struct clk **s3cfb_clk)

{

struct clk *sclk = NULL;

struct clk *mout_mpll = NULL;

struct clk *lcd_clk = NULL;

u32 rate = 0;

int ret = 0;

lcd_clk = clk_get(&pdev->dev, "lcd");

if (IS_ERR(lcd_clk)) {

dev_err(&pdev->dev, "failed to get operation clk for fimd\n");

goto err_clk0;

}

ret = clk_enable(lcd_clk);

if (ret < 0) {

dev_err(&pdev->dev, "failed to clk_enable of lcd clk for fimd\n");

goto err_clk0;

}

clk_put(lcd_clk);

sclk = clk_get(&pdev->dev, "sclk_fimd");

if (IS_ERR(sclk)) {

dev_err(&pdev->dev, "failed to get sclk for fimd\n");

goto err_clk1;

}

if (soc_is_exynos4210())

mout_mpll = clk_get(&pdev->dev, "mout_mpll");

else

mout_mpll = clk_get(&pdev->dev, "mout_mpll_user");

if (IS_ERR(mout_mpll)) {

dev_err(&pdev->dev, "failed to get mout_mpll for fimd\n");

goto err_clk2;

}

ret = clk_set_parent(sclk, mout_mpll);

if (ret < 0) {

dev_err(&pdev->dev, "failed to clk_set_parent for fimd\n");

goto err_clk2;

}

ret = clk_set_rate(sclk, 800000000);

if (ret < 0) {

dev_err(&pdev->dev, "failed to clk_set_rate of sclk for fimd\n");

goto err_clk2;

}

dev_dbg(&pdev->dev, "set fimd sclk rate to %d\n", rate);

clk_put(mout_mpll);

ret = clk_enable(sclk);

if (ret < 0) {

dev_err(&pdev->dev, "failed to clk_enable of sclk for fimd\n");

goto err_clk2;

}

*s3cfb_clk = sclk;

return 0;

err_clk2:

clk_put(mout_mpll);

err_clk1:

clk_put(sclk);

err_clk0:

clk_put(lcd_clk);

return -EINVAL;

}

int s3cfb_clk_off(struct platform_device *pdev, struct clk **clk)

{

struct clk *lcd_clk = NULL;

lcd_clk = clk_get(&pdev->dev, "lcd");

if (IS_ERR(lcd_clk)) {

printk(KERN_ERR "failed to get ip clk for fimd0\n");

goto err_clk0;

}

clk_disable(lcd_clk);

clk_put(lcd_clk);

clk_disable(*clk);

clk_put(*clk);

*clk = NULL;

return 0;

err_clk0:

clk_put(lcd_clk);

return -EINVAL;

}

void s3cfb_get_clk_name(char *clk_name)

{

strcpy(clk_name, "sclk_fimd");

}

然后是 s3cfb_backlight_on 函数,这个是使能屏幕显示,s3cfb_backlight_off 关闭屏幕显示。

时间: 2024-10-06 16:49:14

[迅为开发板资料分享]iTOP-4412开发板LCD的屏幕驱动的相关文章

[转载]嵌入式开发板-iTOP-4412开发板LCD的屏幕驱动

平台:iTOP-4412开发板 大家好今天我们来讲一下 iTOP-4412 开发板 LCD 的屏幕驱动, iTOP-4412 开发板支持 4.3 寸, 7 寸, 9.7寸的 lcd 显示屏.其中 4.3 寸屏是用的 cpu 直接出来的 RGB 信号,7 寸屏和 9.7 寸屏是用的 LVDS 信号,硬件 上 使 用 了 一 个 RGB 转 LVDS 的 芯 片 实 现 的 . 我 们 来 看 下 显 示 驱 动 , 显 示 驱 动 在 内 核 的"drivers/video/samsung&quo

【分享】4412开发板-嵌入式Linux开发需要掌握的基础知识和技能

本文转自迅为电子论坛:http://www.topeetboard.com 1.Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器 2.Shell 编程基础

学完STM32开发板,就选4412开发板让你有目标的学习嵌入式开发

600余页用户使用手册 linux实验手册(资料不断更新)100期配套零基础高清视频教程 轻松入门 (资料不断更新)2000人售后认证群 在线支持 售后无忧 源码全开源  原厂技术资料经典学习书籍推荐 部分视频目录分享: iTOP-4412精英版搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超大容量,纵使海量思考也能及时处理.独家配备三星S5M8767电源管理,最优架构! 配备Android.Linux + Qt.Ubuntu操作系统,开启学习.研发的

iOS开发之资料收集

github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自github:https://github.com/Tim9Liu9/TimLiu-iOS UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者

牛A人士分享关于软件开发十个要点 (一)

英特尔® 黑带软件开发人员是我们社区中最受推崇的成员.他们因为出色的技术专长以及领导力而得到普遍认可.我们采访了一组英特尔® 黑带软件开发成员,分享他们对开发人员所犯的最严重的业务错误的看法,以及他们如何纠正这些错误.以下是他们的看法: 保持原创. 一名黑带开发人员解释道,复制别人的成功很容易. 但是,如果您真的希望赚钱,就需要做些其他开发人员没在做的事情. 提前制定您的商业计划. 许多新手开发人员都是等到最后一刻才会规划自己的商业计划和其他商业方面,但这种做法会适得其反.当您的技术专长非常适合

[资料分享]迅为4412开发板接口详解(一)

开发板平台简要介绍 核心板 Exynos4412有两种封装形式, 其中POP封装的芯片内含1GB内存, 所以不需要外扩DDR, 可大大节省 PCB 面积,功耗控制方面也更好,多用于手持设备当中: SCP 封装优点是内存扩 展更灵活,生产工艺相对更容易控制. 电源芯片 S5M8767 的输入电压范围是 3.5v~5.5v,但是最佳的输入电压是 3.7v~4.2v, 也就是 4v 左右,这样可以使 S5M8767 芯片处于最佳的工作状态.因为开发板提供的电源是5v 的,所以建议大家在开发产品的时候,

嵌入式学习-4412开发板学习-迅为4412开发板can测试技术分享

迅为CAN 测试 详情了解:http://topeetboard.com  更多了解:https://arm-board.taobao.com 本文档适用的范围 ① 硬件平台 :4412精英版以及全能版开发板.(4418/6818开发板以及imx6q开发板测试的道理是一样的可能细节有些不同,在这里我没有做实验,感兴趣的可以按照这个文档测试一下) ②软件平台 :Android4.0.Android4.4.QT.ubuntu 测试程序: 这个在网盘上有提供,另外我也会上传 一.硬件连接 can 通信

嵌入式开发-迅为4412开发板QT鼠标和触摸的问题解决方案

迅为4412开发板-QT鼠标和触摸的问题解决方案: 一. 背景 在使用迅为提供的QT4.7的时候,鼠标可以正常使用,有触摸但是触摸会出现问题.尤其是在左右滑动qt界面的时候,总是会出现往左滑动,画面急速往右走,然而往右滑动,画面急速的往左走. 在使用迅为提供的Qtopia4的时候,只能用触摸不能用鼠标. 二.解决办法 ① QT4.7系统 打开/bin/qt4 找到这句话: export QWS_MOUSE_PROTO='MouseMan:/dev/input/mice Tslib:/dev/in

嵌入式开发板 迅为4412开发板 初学ARM开发板首选!提供教学视频!

选择迅为4412开发板无论是学习ARM技术还是开发产品都无须担心,迅为4412开发板提供了丰富的例程源码实例和视频,只需要你有C语言基础,就可以快速学习嵌入式高端技术开发! 搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超大容量,纵使海量思考也能及时处理. 详情了解: http://topeetboard.com   更多了解:https://arm-board.taobao.com