首先编译环境配置
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 设置硬件相关的操作*/
上一篇:linux2.6.32.2 mini2440平台移植-- 配置 USB 外设、SD卡移植
下一篇:ucos-ii移植到ARM上的一个简单例子mini2440
推荐阅读最新更新时间:2024-11-08 01:53
设计资源 培训 开发板 精华推荐
- LT1307CS8 单节 CCFL 电源典型应用电路
- AD5330 并行接口、单电压输出、8 位 DAC 的典型应用
- 使用符合 EN55022 A 类(双输出)EMC 滤波的 RP40-2424SFR DC/DC 转换器的典型应用
- AM3G-1212SZ 12V 3 瓦 DC-DC 转换器的典型应用
- 音频功率放大器
- LTC3859IFE 高效宽输入范围双路 5V/8.5V 转换器的典型应用电路
- 具有低电池电量检测功能的 LTC1174、6V 至 5V 降压稳压器的典型应用电路
- 用于便携式的 10 位 4 通道 DAC
- 1.57寸ips 触摸屏 320x360 spi CGHAX157-010
- W487304AS1C1_车库板
- AMD推出第二代Versal Premium系列产品:首款PCIe 6.0和CXL 3.1的SoC FPGA
- 红帽宣布达成收购Neural Magic的最终协议
- 5G网速比4G快但感知差!邬贺铨:6G标准制定应重视用户需求
- SEMI报告:2024年第三季度全球硅晶圆出货量增长6%
- OpenAI呼吁建立“北美人工智能联盟” 好与中国竞争
- 传OpenAI即将推出新款智能体 能为用户自动执行任务
- 尼得科智动率先推出两轮车用电动离合器ECU
- ASML在2024 年投资者日会议上就市场机遇提供最新看法
- AMD将裁员4%,以在人工智能芯片领域争取更强的市场地位
- Arm:以高效计算平台为核心,内外协力共筑可持续未来
- 【直播】恩智浦Thread/BLE双模技术讲座
- 创新驱动变革,R&S示波器助力功率电子测试
- 免费试用Atmel MCU开发板,抢“鲜”体验优越性能,更有大奖等你拿!
- 学习Altera《SoC FPGA:体系结构重要吗?》文章,答题赢好礼!
- 追更有惊喜:解救被FSM折磨过的你,justd0解析LSM6DSOX有限状态机官方例程
- 【抢楼有礼】聊聊我们遇到的电感问题!
- Follow me第3期来袭,与得捷一起解锁Seeed Studio XIAO ESP32C3!
- 兆易GD32450I-EVAL免费测评试用
- 助力EEWorld 19成长计划,赢取精美好礼!
- 英飞凌BMS解决方案,为电动汽车和储能系统保驾护航!