itop4412 LCD设备驱动详解(一)之DEVICE

LCD的工作,在kernel中有device和driver两个描述,这也是必然。
一.先看device
在palt-s5p/dev-fimd-s5p.c
定义了一个 struct platform_device s3c_device_fb 平台设备

#ifdef CONFIG_FB_S5P   // 选择开关
static struct resource s3cfb_resource[] = {
    [0] = {
        .start  = S5P_PA_FIMD0,  //资源地址
        .end    = S5P_PA_FIMD0 + SZ_32K - 1,
        .flags  = IORESOURCE_MEM,
    },
    [1] = {
        .start  = IRQ_FIMD0_VSYNC, //同步中断
        .end    = IRQ_FIMD0_VSYNC,
        .flags  = IORESOURCE_IRQ,
    },
    [2] = {
        .start  = IRQ_FIMD0_FIFO, //fifo中断
        .end    = IRQ_FIMD0_FIFO,
        .flags  = IORESOURCE_IRQ,
    },
};

static u64 fb_dma_mask = 0xffffffffUL;  //dma 掩码

struct platform_device s3c_device_fb = {  //fb设备定义和描述
    .name       = "s3cfb",  //设备名字
#if defined(CONFIG_ARCH_EXYNOS4)
    .id     = 0,
#else
    .id     = -1,
#endif
    .num_resources  = ARRAY_SIZE(s3cfb_resource),//指定上面的资源
    .resource   = s3cfb_resource,
    .dev        = {
        .dma_mask       = &fb_dma_mask,
        .coherent_dma_mask  = 0xffffffffUL
    }
};

 这上面是device 和exynos 相关的lcd寄存器资源和中断,   除了这些还有一些其他的相关信息如下(所以该文件中还有如下:)
static struct s3c_platform_fb default_fb_data __initdata = {
#if defined(CONFIG_ARCH_EXYNOS4)
    .hw_ver = 0x70,
#else
    .hw_ver = 0x62,
#endif
    .nr_wins    = 5,  //支持的窗口数
#if defined(CONFIG_FB_S5P_DEFAULT_WINDOW) 
    .default_win    = CONFIG_FB_S5P_DEFAULT_WINDOW, //指定默认显示窗口
#else
    .default_win    = 0,
#endif
    .swap       = FB_SWAP_WORD | FB_SWAP_HWORD, //数据字交换
};

struct s3c_platform_fb default_fb_data 该结构体是是设备的 缺省初始化,当然你还可以指定
,靠的就是下面的这个函数

void __init s3cfb_set_platdata(struct s3c_platform_fb *pd)
{
    struct s3c_platform_fb *npd;
    int i;

    if (!pd) //是判断使用缺省配置。 确定因素在boardtiao调用该函数时,是否添加此参数
        pd = &default_fb_data;

    npd = kmemdup(pd, sizeof(struct s3c_platform_fb), GFP_KERNEL);
    if (!npd)
        printk(KERN_ERR "%s: no memory for platform data\n", __func__);
    else {
        for (i = 0; i < npd->nr_wins; i++) //初始化每个窗口的id
            npd->nr_buffers[i] = 1;

#if defined(CONFIG_FB_S5P_NR_BUFFERS)
        npd->nr_buffers[npd->default_win] = CONFIG_FB_S5P_NR_BUFFERS;
#else
        npd->nr_buffers[npd->default_win] = 1;
#endif
        //下面这些函数都是在 driver 匹配后,在里面调用
        s3cfb_get_clk_name(npd->clk_name); //获取时钟
        npd->cfg_gpio = s3cfb_cfg_gpio; //获取引脚操作函数
        npd->backlight_on = s3cfb_backlight_on; //开背光
        npd->backlight_off = s3cfb_backlight_off; //关背光
        npd->lcd_on = s3cfb_lcd_on;  //使能lcd设备
        npd->lcd_off = s3cfb_lcd_off;//关闭lcd 设备
        npd->clk_on = s3cfb_clk_on; // 时钟开
        npd->clk_off = s3cfb_clk_off; 时钟关

        s3c_device_fb.dev.platform_data = npd;//把初始化的驱动相关信息放到dev的私有数据里面
        // 供驱动使用,在驱动中我们将看到如何调用的
    }
}
#endif

针对上面的s3cfb_set_platdata:
board文件中看到:是否确定参数,如下

是否需要添加取决于你的开关,我用的是普通屏,所以选择的是s3cfb_set_platdata(NULL)
#ifdef CONFIG_FB_S5P
#ifdef CONFIG_FB_S5P_LMS501KF03
    spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
    s3cfb_set_platdata(&lms501kf03_data); //set_data
#else
    s3cfb_set_platdata(NULL);//set_data   
#endif

来看看时钟: s3cfb_get_clk_name(npd->clk_name);是获得设备时钟name,该函数在
setuo-fb-s5pc.c 中函数原型如下:

void s3cfb_get_clk_name(char *clk_name)
{
    strcpy(clk_name, "sclk_fimd"); //可以看出所用的clk
}
而下面是对设备操作的初始化(都在setuo-fb-s5pc.c ,指定相关硬件 的操作): 
npd->cfg_gpio = s3cfb_cfg_gpio; 
npd->backlight_on = s3cfb_backlight_on; 
npd->backlight_off = s3cfb_backlight_off; 
npd->lcd_on = s3cfb_lcd_on; 
npd->lcd_off = s3cfb_lcd_off; 
npd->clk_on = s3cfb_clk_on; 
npd->clk_off = s3cfb_clk_off; 
在这里不做介绍,在驱动调用时,分析
-----总上,有了设备如何添加到内核中,board 文件中有这样一句:
static struct platform_device *smdk4x12_devices[] __initdata = {
。。。。。。。。
#ifdef CONFIG_FB_S5P
&s3c_device_fb
。。。。。。。。,
有此可以看出。此项可以根据内核配置
 Device Drivers  --->  
                 Graphics support  --->
                       <*> Support for frame buffer devices  ---> 
                                     <*>   S5P Framebuffer support 
好了设备device我们就分析完了。 
总结了一下: 
先定义了一个struct platform_device s3c_device_fb 结构体 
然后指定了一下io和中断资源在static struct resource s3cfb_resource[] 中 
之后定义了一个缺省配置 struct s3c_platform_fb default_fb_data ,而是否使用取决于 
s3cfb_set_platdata(struct s3c_platform_fb *pd) 函数,该函数做了一下时钟 ,io,背光等操作集后,把这些操作都放在了s3c_device_fb.dev.platform_data = npd; 中供驱动匹配时调用

<接下来我们将要分析driver ,未完待续>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
itop4412移植SSH,你可以按照以下步骤进行操作: 1. 首先,将SSH源代码拷贝到itop4412的开发环境中。你可以使用SCP命令将源代码从本地计算机复制到itop4412上的指定目录。例如,将源代码复制到itop4412的`/home/project/ssh-arm/openssh-4.6p1`目录下: ```shell scp /path/to/openssh-4.6p1.tar.gz root@itop4412:/home/project/ssh-arm/ ``` 2. 解压源代码文件。在itop4412上的开发环境中,使用以下命令解压源代码文件: ```shell tar -zxvf openssh-4.6p1.tar.gz ``` 3. 进入解压后的源代码目录: ```shell cd openssh-4.6p1 ``` 4. 配置编译选项。运行以下命令以配置SSH的编译选项: ```shell ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/ssh ``` 这里的`--host`选项指定了目标平台为arm-linux-gnueabihf,`--prefix`选项指定了安装目录为`/usr/local/ssh`。 5. 编译源代码。运行以下命令以编译SSH源代码: ```shell make ``` 6. 安装SSH。运行以下命令以将编译后的SSH安装到指定目录: ```shell make install ``` 这将把SSH安装到`/usr/local/ssh`目录下。 7. 配置SSH服务器。在itop4412上的开发环境中,编辑SSH服务器的配置文件`/usr/local/ssh/etc/sshd_config`,根据你的需求进行配置。 8. 启动SSH服务器。运行以下命令以启动SSH服务器: ```shell /usr/local/ssh/sbin/sshd ``` 现在,你已经成功在itop4412移植了SSH,并启动了SSH服务器。你可以使用SSH客户端连接到itop4412并进行远程操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值