注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

嵌入式开发实战4——内核的编译之七RTC和LCD背光支持  

2012-06-14 15:03:53|  分类: ARM开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

嵌入式开发实战4——内核的编译之七RTC和LCD背光支持

昨天忘记写下工作记录了,只好今天补上,早早弄完了,却去看别的,网络是反双刃剑啊,言归正传。

今天主要是增加对LINUX内核的RTC和LCD的支持。

一、RTC的支持

在LINUX这个版本中,对RTC的支持已经做好了,只要做一些简单的配置修改就可以了。看到下面这个熟悉的结构体没:

static struct platform_device *mini2440_devices[] __initdata = {

        &s3c_device_usb,

         &s3c_device_rtc,

        &s3c_device_lcd,

        &s3c_device_wdt,

        &s3c_device_i2c0,

        &s3c_device_iis,

        &mini2440_device_eth,

        &s3c_device_nand,

};

增加第二行即可。

然后,回到内核的顶层目录,make menuconfig,进入配置界面,在

Device Drivers  --->

  <*> Real Time Clock  --->

发现已经默认选择了这个,但是,大家要明白,只有最后一个选项下最后部分的:<*>      Samsung S3C series SoC RTC 选项支持,这里才是内核中真正的2440之RTC 驱动配置项.

Make zImage,下载到开发板,测试方面见MINI2440的开发文档,这里不再复述。

二、LCD背光的支持

开启LCD的背光,然后再使用LCD显示,大家就可以从石器时代进入到帝国时代。至少可以看到东西了,不用在黑乎乎的界面上操作。

首先在linux2.6.32.2/drivers/video中增加一个驱动文件:mini2440_backlight.c

// 以下头文件可能并不是每一个都必须的,但多余的并不会影响驱动程序的内容

#include <linux/errno.h>

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/slab.h>

#include <linux/input.h>

#include <linux/init.h>

#include <linux/serio.h>

#include <linux/delay.h>

#include <linux/clk.h>

#include <linux/miscdevice.h>

#include <linux/gpio.h>

 

#include <asm/io.h>

#include <asm/irq.h>

#include <asm/uaccess.h>

#include <mach/regs-clock.h>

#include <plat/regs-timer.h>

  

#include <mach/regs-gpio.h>

#include <linux/cdev.h>

 

#undef DEBUG

//#define DEBUG

#ifdef DEBUG

 

 

#define DPRINTK(x...) {printk(__FUNCTI ON__"(%d): ",__LINE__);printk(##x);}

#else

#define DPRINTK(x...) (void)(0)

#endif

 

//定义背光驱动的名称为backligh,将会出现在/dev/backlight

#define DEVICE_NAME  "backlight"

 

//定义背光变量bl_state,以记录背光的开关状态

static unsigned int bl_state;

 

//设置背光开关的函数,主要是翻转背光变量bl_state

static inline void set_bl(int state)

{

  bl_state = !!state;  // 翻转 bl_state变量

 s3c2410_gpio_setpin(S3C2410_GPG(4), bl_state); // 把结果写入背光所用的寄存器 GPG4

}

 

//获取背光状态

static inline unsigned int get_bl(void)

{

 return bl_state;

}

 

//从应用程序读取参数,并传递到内核中

static ssize_t dev_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)

{

  unsigned char ch;

 int ret;

  if (count == 0) {

  return count;

 }

     // 使用 copy_from_user 函数从用户层/ 应用层读取参数

  ret = copy_from_user(&ch, buffe r, sizeof ch) ? -EFAULT : 0;

  if (ret) {

  return ret;

 }

 

    ch &= 0x01; // 判断奇数还是偶数

 

 

 set_bl(ch); // 设置背光状态

  

 return count;

}

 

// 把内核参数传递给用户层/ 应用层的读函数

static ssize_t dev_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)

{

 int ret;

  unsigned char str[] = {'0', '1' };

 

  if (count == 0) {

  return 0;

 }

 

     // 使用 copy_to_user 函数把内核参数传递到用户层/ 应用层

  ret = copy_to_user(buffer, str + get_bl(), sizeof(unsigned char) ) ? -EFAULT : 0;

  if (ret) {

  return ret;

 }

 

 return sizeof(unsigned char);

}

 

//设备操作集

static struct file_operations dev_fops = {

 owner: THIS_MODULE,

 read:dev_read, 

 write: dev_write,

};

 

static struct miscdevice misc = {

  .minor = MISC_DYNAMIC_MINOR,

  .name = DEVICE_NAME,

  .fops = &dev_fops,

};

 

// 设备初始化,内核启动时就有效

static int __init dev_init(void)

 

 

{

 int ret;

 

  ret = misc_register(&misc);

 

 printk (DEVICE_NAME"\tinitialized\n");

 

     // 初始化背光所用的端口 GPG4 为输出

 s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT);

     // 启动内核时打开背光

 set_bl(1);

 return ret;

}

 

 

static void __exit dev_exit(void)

{

 misc_deregister(&misc);

}

 

module_init(dev_init); // 注册背光驱动模块

module_exit(dev_exit); // 卸载背光驱动模块

MODULE_LICENSE("GPL");

MODULE_AUTHOR("FriendlyARM Inc.");

 

然后把背光配置选项加入内核配置菜单,打开 linux-2.6.32.2/drivers/video/Kconfig ,在下面加入红色部分: 

config FB_S3C2410_DEBUG

        bool "S3C2410 lcd debug messages"

        depends on FB_S3C2410

        help

                    Turn on debugging messages. Note that you can set/unset at run time

          through sysfs

 

# 在里加入MINI2440的背光驱动配置

config BACKLIGHT_MINI2440

                tristate "Backlight support for mini2440 from FriendlyARM"

        depends on MACH_MINI2440 && FB_S3C2410

        help

          backlight driver for MINI2440 from FriendlyARM

 

 

 

config FB_SM501

        tristate "Silicon Motion SM501 framebuffer support"

        depends on FB && MFD_SM501

        select FB_CFB_FILLRECT

        select FB_CFB_COPYAREA

        select FB_CFB_IMAGEBLIT

再打开linux-2.6.32.2/drivers/video/Makefile ,根据配置定义加入驱动目标文件,如下位置:

# the test framebuffer is last

obj-$(CONFIG_FB_VIRTUAL)          += vfb.o

 

#video output switch sysfs driver

obj-$(CONFIG_VIDEO_OUTPUT_CONTROL) += output.o

 

obj-$(CONFIG_BACKLIGHT_MINI2440) += mini2440_backlight.o 

这样,就搞定了背光的支持,同样,make menuconfig进入配置菜单:

Device Drivers  --->

   Graphics support  --->

      <*> Support for frame buffer devices  --->

在这里选中增加的MINI2440背光设置。

最后,make zImage,等一会儿,就可以把生成的image下载到板儿上了。

时不我待,努力奋发。

  评论这张
 
阅读(738)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017