ARM-Linux S5PV210 UART驱动(6)----platform device的添加

发布者:Blissful5最新更新时间:2024-12-17 来源: cnblogs关键字:ARM-Linux  S5PV210  UART驱动  platform  device 手机看文章 扫描二维码
随时随地手机看文章

开发板是飞凌OK210


arch/arm/mach-s5pv210/mach-smdkc110.c


首先是UART的寄存器默认配置信息:


/* Following are default values for UCON, ULCON and UFCON UART registers */

#define S5PV210_UCON_DEFAULT    (S3C2410_UCON_TXILEVEL |   

                 S3C2410_UCON_RXILEVEL |   

                 S3C2410_UCON_TXIRQMODE |   

                 S3C2410_UCON_RXIRQMODE |   

                 S3C2410_UCON_RXFIFO_TOI |   

                 S3C2443_UCON_RXERR_IRQEN)


#define S5PV210_ULCON_DEFAULT    S3C2410_LCON_CS8


#define S5PV210_UFCON_DEFAULT    (S3C2410_UFCON_FIFOMODE |   

                 S5PV210_UFCON_TXTRIG4 |   

                 S5PV210_UFCON_RXTRIG4)


static struct s3c2410_uartcfg smdkc110_uartcfgs[] __initdata = {

    {

        .hwport        = 0,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

    {

        .hwport        = 1,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

#ifndef CONFIG_FIQ_DEBUGGER

    {

        .hwport        = 2,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

#endif

    {

        .hwport        = 3,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

};


下面是添加platform device的具体过程:


1.


/*调用MACHINE_START宏

MACHINE_START和MACHINE_END框起了一个machine_desc结构体的声明并根据MACHINE_START宏的参数初始化其.nr和.name成员

并将该结构体标记编译到.arch.info.init段

在MACHINE_START和MACHINE_END宏之间可以初始化machine_desc结构体的剩余成员

*/

#ifdef CONFIG_MACH_SMDKC110

MACHINE_START(SMDKC110, 'SMDKC110')

#elif CONFIG_MACH_SMDKV210

MACHINE_START(SMDKV210, 'SMDKV210')

#endif

    /* Maintainer: Kukjin Kim */

    .phys_io    = S3C_PA_UART & 0xfff00000,

    .io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,

    .boot_params    = S5P_PA_SDRAM + 0x100,

    .init_irq    = s5pv210_init_irq,//板级中断初始化函数

    .map_io        = smdkc110_map_io,//板级io初始化函数

    .init_machine    = smdkc110_machine_init,//板级初始化函数

    .timer        = &s5p_systimer,

MACHINE_END


2.


static void __init smdkc110_map_io(void)

{

    s5p_init_io(NULL, 0, S5P_VA_CHIPID);

    s3c24xx_init_clocks(24000000);

    s5pv210_gpiolib_init();

    s3c24xx_init_uarts(smdkc110_uartcfgs, ARRAY_SIZE(smdkc110_uartcfgs));

    s5p_reserve_bootmem(smdkc110_media_devs, ARRAY_SIZE(smdkc110_media_devs));

#ifdef CONFIG_MTD_ONENAND

    s5pc110_device_onenand.name = 's5pc110-onenand';

#endif

#ifdef CONFIG_MTD_NAND

    s3c_device_nand.name = 's5pv210-nand';

#endif

    s5p_device_rtc.name = 'smdkc110-rtc';


}


3.


/* table of supported CPUs */

static struct cpu_table cpu_ids[] __initdata = {

{

        .idcode        = 0x43110000,

        .idmask        = 0xfffff000,

        .map_io        = s5pv210_map_io,

        .init_clocks    = s5pv210_init_clocks,

        .init_uarts    = s5pv210_init_uarts,

        .init        = s5pv210_init,

        .name        = name_s5pv210,

    },

};


arch/arm/plat-samsung/init.c


void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)

{

    if (cpu == NULL)

        return;


    if (cpu->init_uarts == NULL) {

        printk(KERN_ERR 's3c24xx_init_uarts: cpu has no uart initn');

    } else

        (cpu->init_uarts)(cfg, no);//这里最终会调用上面的s5pv210_init_uarts

}


4.


#define s5pv210_init_uarts s5pv210_common_init_uarts

 

/* uart registration process */

void __init s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)

{

    struct s3c2410_uartcfg *tcfg = cfg;

    u32 ucnt;


    for (ucnt = 0; ucnt < no; ucnt++, tcfg++) {

        if (!tcfg->clocks) {

            tcfg->clocks = s5pv210_serial_clocks;

            tcfg->clocks_size = ARRAY_SIZE(s5pv210_serial_clocks);

        }

    }


    s3c24xx_init_uartdevs('s5pv210-uart', s5p_uart_resources, cfg, no);

}


5.


arch/arm/plat-samsung/init.c


void __init s3c24xx_init_uartdevs(char *name,

                  struct s3c24xx_uart_resources *res,

                  struct s3c2410_uartcfg *cfg, int no)

{

    struct platform_device *platdev;

    struct s3c2410_uartcfg *cfgptr = uart_cfgs;

    struct s3c24xx_uart_resources *resp;

    int uart;


    memcpy(cfgptr, cfg, sizeof(struct s3c2410_uartcfg) * no);


    for (uart = 0; uart < no; uart++, cfg++, cfgptr++) {

        platdev = s3c24xx_uart_src[cfgptr->hwport];


        resp = res + cfgptr->hwport;


        s3c24xx_uart_devs[uart] = platdev;


        platdev->name = name;

        platdev->resource = resp->resources;

        platdev->num_resources = resp->nr_resources;


        platdev->dev.platform_data = cfgptr;//将cfg挂到platdev->dev.platform_data上

    }


    nr_uarts = no;

}


static int __init s3c_arch_init(void)

{

    int ret;


    // do the correct init for cpu


    if (cpu == NULL)

        panic('s3c_arch_init: NULL cpun');


    ret = (cpu->init)();

    if (ret != 0)

        return ret;


    ret = platform_add_devices(s3c24xx_uart_devs, nr_uarts);

    return ret;

}


arch_initcall(s3c_arch_init);


关键字:ARM-Linux  S5PV210  UART驱动  platform  device 引用地址:ARM-Linux S5PV210 UART驱动(6)----platform device的添加

上一篇:点亮指路灯
下一篇:ARM-Linux S5PV210 UART驱动(5)----串口的open操作(tty_open、uart_open)

推荐阅读最新更新时间:2026-03-25 11:22

ARM-Linux S5PV210 UART驱动(3)----串口核心层、关键结构体、接口关系
尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现tty_operations其中的成员函数,但是Linux已经在文件serial_core.c中实现了UART设备的通用tty驱动层,称为串口核心层,这样,UART驱动的主要任务变成了实现serial_core.c中定义的一组uart_xxx接口而非tty_xxx接口。   uart设备是继tty_driver的又一层封装.实际上uart_driver就是对应tty_driver.在它的操作函数中,将操作转入uart_port.在写操作的时候,先将数据放入一个叫做circ_buf的环形缓存区.然后uart_port从缓存
[单片机]
<font color='red'>ARM-Linux</font> <font color='red'>S5PV210</font> <font color='red'>UART</font><font color='red'>驱动</font>(3)----串口核心层、关键结构体、接口关系
分析一下UART IIC SPI驱动编写步骤
1,首先都是设置引脚的功能,把引脚设置到对应的模式 2,然后设置对应串口控制器的一些参数(也就寄存器的一些参数),完成对串口的基本设置,比如UART的波特率等等的。要配置哪些参数一般在对应外设的初始化结构体里都列了。所以这个步骤就变得很简单,就往对应外设的初始化结构体里面赋值就行了。而且我发现对引脚的设置其实也是对引脚的那个结构体的里面的参数赋值!!!!!都给它弄成结构体了,很方便!!!!!!!!!!所以整个过程就变成了往两个结构体里面填值就可以了,怪不得都不不需要变成用STM32cube选几下就可以了!!!!!!确实本质就是这样子的!!!!!!! 3,然后写发送或者接收。 我觉得主体可以分为以上三个部分。
[单片机]
分析一下<font color='red'>UART</font> IIC SPI<font color='red'>驱动</font>编写步骤
STM32 UART串口驱动程序
示例1.通过UART1进行数据发送 UART 1 的初始化 /** * @brief UART1 Initialise. * @param None. * @retval None. */ void UART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //UART1 选择对应UART的RCC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GP
[单片机]
S3C2440之UART驱动代码模板(RealView MDK)
好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出S3C2440 UART驱动代码。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。需要注意的是,本代码中,对GPIO的初始化放在了s3c2440.s中完成,采用keil自带的html方式进行配置。 该源码结构简单明了,原始工程下载地址: 点击打开链接 UART控制器初始化: void Uart_Init(void) { #define rULCON0 (*(volatile unsigned int*)0x50000000) #define rUCON0 (*(volatile unsigned int*
[单片机]
ARM:UART串口异步通信驱动编程
1. 串口的基本概念 1.1 UART - 串行异步收发器 Universal Asynchronous Receiver/Transmitter 串行/并行(课后补充) 异步/同步:'异步/同步通信两者之间的区别' (补充) '单工/半双工/全双工: 单工:任何时候数据只能朝一个方向传输 半双工:数据可以向两个方向传输,任何同一时刻只能朝同一方向传输 全双工:数据可以同时向两个方向传输 1.2 串口通信标准 RS232 (电子工业协议EIA) - 目前最常用的'串行接口标准' 规定了'电气特性': 逻辑 0 ,+3 v ~ +15 v,SPACE 逻辑 1 ,- 3 v ~
[单片机]
STM32F4XX高效驱动篇1-UART
之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下。并奉驱动程序,本程序覆盖uart1-8。 串口驱动,这是在每个单片机中可以说是必备接口。可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口。这样一个高效的驱动是决定您产品优劣的关键因素。本文主要针对STM32F4XX系列芯片做的一个驱动接口层。以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的。 从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大的引脚映射功能,强大的处理能力等,给我留下的深刻的印象。 关于串口的使用方式,个人总结出以下三种: 1) 中断接收,状态查询发送:
[单片机]
利用低成本的MCU的UART驱动智能卡
在银行、身份识别和电信市场中,对安全和增强的功能性不断增长的需要,增加了全球范围智能卡的使用。另一方面,这也使得对安全性较低的磁条卡的使用量下降。 然而,所需的基于智能卡系统中,适当的通信系统的硬件和固件开发,给设计师带来了新的挑战。不幸的是,只有一些高档微控制器具有可以直接驱动智能卡的专用UART。里所述的设计,可以让你采用低端8位微控制器上标准的UART来驱动智能卡,本文采用的MCU为Atmel公司的AVR ATmega168。 智能卡只有一条与外界通信的路径,即标记的(labeled)I/O,所以它被用作一种数据输入输出信号的双向信号。该信号必须与UART的传输和接收信号的接收信号RxD和TxD分别组成列队。因为RxD是
[单片机]
利用低成本的MCU的<font color='red'>UART</font><font color='red'>驱动</font>智能卡
ARM-Linux移植之(三)——init进程启动流程分析
我们通常使用Busybox来构建根文件系统的必要的应用程序。Busybox通过传入的参数来决定执行何种操作。当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分析这个函数,看init进程究竟是怎样一个流程。我分析的Busybox源码是1.7.0版本的,其他版本会略有不同。部分代码省略我们只看关键性代码。 首先看init_main函数 int init_main(int argc, char **argv); int init_main(int argc, char **argv) { …………………………….. …………………………….. //初始化控制台 console_i
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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