Mini2440 linux之LCD驱动 移植、以及一些遇到的问题

发布者:紫菜包饭最新更新时间:2022-10-18 来源: csdn关键字:Mini2440  linux  LCD驱动  移植 手机看文章 扫描二维码
随时随地手机看文章

首先编译环境配置


linux 2.6.32源码


arm-linux-gcc  交叉编译器


有mini2440的根文件系统


这里默认环境都配好了


打开linux源码文件夹,进入后,找到对应开发板的配置文件

将其复制一份重命名为.config


cp config_mini2440_n35 .config

然后执行内核配置,更加自己需要增减模块后退出


make menuconfig

 将默认的LCD配置去掉,换上我们自己的驱动  完成后 exit退出


找到Device Drivers ->Graphics support->support for frame buffer devices->


去掉默认的s3c2440 lcd frame buffer support


勾上我们自己添加的mylcd lcd frame buffer support

 

 

 


这里讲讲怎么添加自己的选项


打开目录  linux2.6.32/drivers/video


修改里面的Kconfig文件和makefile文件


在Kconfig中找到config FB_S3C2410附近的行添加


config FB_MYLCD

tristate "MY LCD framebuffer support"

depends on FB && ARCH_S3C2410

select FB_CFB_FILLRECT

select FB_CFB_COPYAREA

select FB_CFB_IMAGEBLIT

---help---

  Frame buffer driver for the built-in LCD controller in the Samsung

  S3C2410 processor.

 

  This driver is also available as a module ( = code which can be

  inserted and removed from the running kernel whenever you want). The

  module will be called s3c2410fb. If you want to compile it as a module,

  say M here and read .

 

  If unsure, say N.


添加后是这样

打开makefile


在最下面添加,这里的mylcd2是我写的驱动文件,也是在此目录下的


obj-$(CONFIG_FB_MYLCD)   += mylcd2.o

添加后是这样(obj-m 表示模块编译,obj-y 表示编译进内核)

接下来下lcd的驱动,在linux2.6.32/drivers/video目录下,创建mylcd2.c文件


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include  

#include

#include

#include  

#include

 

#include

#include

#include


/*LCD :  240*320     */

#define   LCD_xres     240        //LCD 行分辨率

#define   LCD_yres     320          //LCD列分辨率


/*

根据像素时钟频率计算行频(HSF)和场频(VSF):

一行刷新率  HSF=VCLK÷[(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)]

帧率       VSF=HSF÷[(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)]

*/

 

//LCDCON1

#define LCD_CLKVAL    8         //[17:8]   5.6MHZ的像素时钟频率=8

#define LCD_PNRMODE   3         //[6:5]  =0b11  tft

#define LCD_BPPMODE   12         //[4:1] =0b1100 16bpp

 

//LCDCON2

#define LCD_VBPD     (1-1)     //[31:24] 这个值越大 显示的图像就越往下偏,根据屏幕的典型值配置即可

#define LCD_LINEVAL  (LCD_yres-1)     //[23:14]

#define LCD_VFPD     (5-1)     //[13:6]  

#define LCD_VSPW     (1-1)     //[5:0]

 

//LCDCON3

#define LCD_HBPD     (36-1)     //[25:19]  这个值越大 显示的图像就越往右偏

#define LCD_HOZVAL   (LCD_xres-1)    //[18:8]

#define LCD_HFPD     (19-1)//(2-1)    //[7:0] 

 

//LCDCON4

#define LCD_HSPW     (5-1)     //[7:0]

 

//LCDCON5 

#define LCD_FRM565     1     //[11]  =0,5:5:5:1; =1,5:6:5

#define LCD_INVVCLK    1    //[10]

#define LCD_INVLINE    1    //[9]

#define LCD_INVVFRAME   1    //[8]

#define LCD_BSWP       0   //[1]

#define LCD_HWSWP      1   //[0]


/* GPIO prot   */

static unsigned long  *GPBcon;

static unsigned long  *GPCcon;

static unsigned long  *GPDcon;

static unsigned long  *GPGcon;  //GPG4:控制LCD信号 

static unsigned long  *GPBdat;   //GPB0: 控制背光

 

/* LCD control */ 

 struct  lcd_reg{  

      unsigned long    lcdcon1; 

      unsigned long       lcdcon2;  

      unsigned long       lcdcon3; 

      unsigned long       lcdcon4; 

      unsigned long       lcdcon5; 

      unsigned long       lcdsaddr1;     

      unsigned long       lcdsaddr2;     

      unsigned long       lcdsaddr3 ;

      unsigned long       redlut;   

      unsigned long       greenlut;

      unsigned long       bluelut;

      unsigned long       reserved[9];  

      unsigned long       dithmode;     

      unsigned long       tpal ;    

      unsigned long       lcdintpnd;

      unsigned long       lcdsrcpnd;

      unsigned long       lcdintmsk;

      unsigned long       tconsel;  

};

 

static struct lcd_reg  *lcd_reg;

 

static struct fb_info *my_lcd;    //定义一个全局变量

static u32 pseudo_palette[16];   //调色板数组,被fb_info->pseudo_palette调用

 

static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)

{

/*内核中的单色都是16位,默认从左到右排列,比如G颜色[0x1f],那么chan就等于0XF800*/

       chan       &= 0xffff;

       chan       >>= 16 - bf->length;    //右移,将数据靠到位0上

       return chan << bf->offset;    //左移一定偏移值,放入16色数据中对应的位置

}

 

static int my_lcdfb_setcolreg(unsigned int regno, unsigned int red,unsigned int green, unsigned int blue,unsigned int transp, struct fb_info *info)      //设置调色板函数,供内核调用

{

       unsigned int val;      

       if (regno >=16)        //调色板数组不能大于15

      return 1;

 

       /* 用red,green,blue三个颜色值构造出16色数据val */

       val  = chan_to_field(red,      &info->var.red);

       val |= chan_to_field(green, &info->var.green);

       val |= chan_to_field(blue,      &info->var.blue);

      

       ((u32 *)(info->pseudo_palette))[regno] = val;     //放到调色板数组中

       return 0;

}

 

 

static struct fb_ops my_lcdfb_ops = {

      .owner           = THIS_MODULE,

      .fb_setcolreg  = my_lcdfb_setcolreg,//调用my_lcdfb_setcolreg()函数,来设置调色板fb_info-> pseudo_palette

      .fb_fillrect       = cfb_fillrect,     //填充矩形

      .fb_copyarea   = cfb_copyarea,     //复制数据

      .fb_imageblit  = cfb_imageblit,    //绘画图形,

};

 

static int lcd_init(void)

{

  /*1.申请一个fb_info结构体*/

  my_lcd= framebuffer_alloc(0,0); 

 

  /*2.设置fb_info*/

 

  /* 2.1设置固定的参数fb_info-> fix */

  /*my_lcd->fix.smem_start    物理地址后面注册MDA缓存区设置*/ 

  strcpy(my_lcd->fix.id, "mylcd");       //名字

  my_lcd->fix.smem_len =LCD_xres*LCD_yres*2;     //地址长

  my_lcd->fix.type        =FB_TYPE_PACKED_PIXELS;

  my_lcd->fix.visual    =FB_VISUAL_TRUECOLOR;    //真彩色

  my_lcd->fix.line_length      =LCD_xres*2;       //LCD 一行的字节

 

  /* 2.2 设置可变的参数fb_info-> var  */

  my_lcd->var.xres        =LCD_xres;          //可见屏X 分辨率

  my_lcd->var.yres        =LCD_yres;          //可见屏y 分辨率

  my_lcd->var.xres_virtual     =LCD_xres;           //虚拟屏x分辨率

  my_lcd->var.yres_virtual     =LCD_yres;           //虚拟屏y分辨率

  my_lcd->var.xoffset           = 0;     //虚拟到可见屏幕之间的行偏移

  my_lcd->var.yoffset           = 0;      //虚拟到可见屏幕之间的行偏移

 

  my_lcd->var.bits_per_pixel  =   16;        //像素为16BPP

  my_lcd->var.grayscale       =   0;    //灰色比例

 

  my_lcd->var.red.offset      =     11;

  my_lcd->var.red.length      =     5;

  my_lcd->var.green.offset  =       5;

  my_lcd->var.green.length  =       6;

  my_lcd->var.blue.offset     =     0;

  my_lcd->var.blue.length     =     5;

 

/* 2.3 设置操作函数fb_info-> fbops  */

  my_lcd->fbops         = &my_lcdfb_ops;


  /* 2.4 设置fb_info 其它的成员  */ 

 /*my_lcd->screen_base    虚拟地址在后面注册MDA缓存区设置*/

  my_lcd->pseudo_palette   =pseudo_palette;    //保存调色板数组

  my_lcd->screen_size          =LCD_xres * LCD_yres *2;     //虚拟地址长

 

  /*3   设置硬件相关的操作*/

[1] [2] [3]
关键字:Mini2440  linux  LCD驱动  移植 引用地址:Mini2440 linux之LCD驱动 移植、以及一些遇到的问题

上一篇:linux2.6.32.2 mini2440平台移植-- 配置 USB 外设、SD卡移植
下一篇:ucos-ii移植到ARM上的一个简单例子mini2440

推荐阅读最新更新时间:2024-11-08 01:53

CDMA网络智能车载导航终端的优化设计
结合gpsOne定位技术、CDMA通信技术和GIS技术的智能车载终端,可与控制中心配合,实现对车辆的导航、报警和监控等多种应用。gpsOne是一种混合定位技术,它综合了GPS和无线网络的优势,具有适用性广、精度高、定位时间短和成本低等特点。 本文提出智能车载导航仪的优化设计方案,剖析gpsOne的定位原理,探讨系统开发中的多项关键技术,并给出一个基于ARM和Linux平台的工程实例。 1 概述 1.1 定位业务的产生背景 随着移动通信的发展,电信服务商与制造商除了语音传输外,纷纷推出各种增值数据业务与设备,以寻找新的收入来源。消费者也希望手机除了通话、收发邮件、上网外,还能有其他功能。国家基础地理信息中心的统
[模拟电子]
嵌入式ARM Linux开发的软硬件方向选择
在这个科技高度发达的今天,相信很多在校学生停留在51单片机上的种种应用开发,做一个小玩意,获得个好名次,这在无形中增加了对单片机的理解和认识,对以后的工作奠定雄厚的基础:汇编语言的使用,可以让你在ARM Bootloader的开发上如鱼得水;各种外围器件的使用,可以让你在应用开发中如沐春风。但是,如果仅仅停留在这个阶段,或者说停留在低端单片机的开发应用上,拿到手的 金子 也有限,这就需要你踏入更加广阔的电子领域 嵌入式开发。现在最流行的是 ARM+Linux 构架,如果在这条路上你走的比较远,那么,这对你的生活质量的提高也大有帮助。 由于 ARM Linux 构架的嵌入式开发范围很广,如果想全部掌握,需要懂Linux使用、Linux
[单片机]
嵌入式ARM <font color='red'>Linux</font>开发的软硬件方向选择
Linux系统下USB摄像头驱动开发
USB摄像头以其良好的性能和低廉的价格得到广泛应用。同时因其灵活、方便的特性,易于集成到嵌入式系统中。但是如果使用现有的符合Video for Linux标准的驱动程序配合通用应用程序,难以充分利用USB带宽,帧速不高,不易满足实时监控等要求。本文首先介绍在Linux系统下USB摄像头驱动编制的一般方法,然后说明在此基础上如何提高帧速。 1 Linux系统中的USB摄像头驱动程序 USB设备驱动程序完全符合通用设备驱动的准则,不同的是内核提供了一些特别的API函数,方便驱动注册、销毁自己,例如usb_reSister()和usb_dereSister();2.4版的内核还提供了对于hotplug的支持。 1.1 USB摄像头
[嵌入式]
4412 Linux定时器
一、Linux定时器基础知识 1.1 定时器的使用范围 延后执行某个操作,定时查询某个状态;前提是对时间要求不高的地方 1.2 内核时间概念 Hz:(系统时钟通过CONFIG_HZ来设置,范围是100-1000;HZ决定使用中断发生的频率) 1/200 = 5ms,说明4412中是5ms产生一次时钟中断。如果就没有定义的话,默认是100 内核的全局变量jiffies:(记录内核自启动来的节拍数,内核之启动以来,产生的中断数)时钟中断,每产生一个中断,jiffies就加1。 jiffies/HZ:jiffies除以Hz得到内核自启动以来的秒数 2.1 内核定时器的例程 结构体timer_list,函数
[单片机]
4412 <font color='red'>Linux</font>定时器
μC/GUI在MSGl9264液晶上的移植
摘要:介绍在MSP430F149单片机上移植,μC/CUI到MSCl9264液晶的过程, 详细阐述了,μC/GUI移植的原理以及在移植中应注意的事项。 关键词:μC/GUI MSGl9264 移植 MSP430F149 μC/GUI是美国Micrium公司出品的一款针对嵌入式系统的优秀图形软件。与μC/OS一样,μC/GUI具有源码公开、可移植、可裁减、稳定性和可靠性高的特点 。采用μC/GUI,开发人员可以很方便地在液晶上显示文本、曲线、图形以及各种窗口对象如按钮、编辑框、滑动条等,可完全产生类似于Windows的显示效果。另外,μC/GUI提供了在VC下的仿真库,这使得用户完全可以在Windows下仿真μC/GUI的各种效
[嵌入式]
AVR128_uC/OS-II 移植代码
开发平台:AVR128 移植系统:uC/OS-II 功能: 系统建立两个任务,操作“8个LED” 以及 “蜂鸣器”(附上LED和蜂鸣器 部分的原理图) 代码量少,添加了个人注释,容易理解 电路原理图如下: 此工程为TS8900-M128开发板uCOSii移植教程代码 功能是 1--8个LED进行“亮-灭”操作 2--控制蜂鸣器“响-不响”操作 单片机源程序如下: /* ***********************************Copyright(c)***************************** * *
[单片机]
AVR128_uC/OS-II <font color='red'>移植</font>代码
赛昉科技发布并开源基于Yocto的昉·天枢Linux SDK
在上周刚举办的RISC-V Summit 2021上, 赛昉科技 作为 RISC-V软硬件 生态的领导者,宣布其自主研发基于RISC-V的64 位CPU Core IP“昉·天枢”正式交付客户。这款产品是迄今为止性能最佳的 RISC-V CPU 内核 IP。它采用最全的RISC-V指令集,包括RV64GC、位操作扩展(B)、用户级中断(N)、向量扩展V(Vector)V1.0与管理程序扩展H(Hypervisor),非常适合高性能计算。 继昉·天枢正式交付之后,周一(12月13日) 赛昉科技 在RVspace开源社区上发布了基于Yocto项目的“StarFive Dubhe Linux 软件开发套件 (SDK)”并且该SDK在
[嵌入式]
赛昉科技发布并开源基于Yocto的昉·天枢<font color='red'>Linux</font> SDK
基于32位RISC处理器SoC平台的Linux操作系统实现
引言 智原科技的FIE8100 SoC平台是一种低功耗、便携式视频相关应用开发SoC平台,也可用于基于FA526 CPU的SoC设计验证。 基于FA526的Linux软件开发套件,开发人员可将Linux一2.4.19软件环境在FIE8100平台上安装实现,并完成对平台上所有IP的驱动程序安装和对FA526的内部调试。 FA526介绍 FA526是一颗有着广泛用途的32位RISC处理器。它包括一个同步CPU内核(core)、独立的指令/数据缓存(cache)、独立的指令/数据暂存器(scratchpads)、一个写缓存(write buffer)、一个内存管理单元(memory management unit)和JTAG在线仿真(
[工业控制]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved