ARM-Linux s3c2440 之UART分析(五)

发布者:温馨阳光最新更新时间:2016-06-12 来源: eefocus关键字:ARM  Linux  s3c2440  UART 手机看文章 扫描二维码
随时随地手机看文章
从上面四篇介绍文章中,已经清楚了串口设备与串口驱动实现的各层次关系流程。是一种从上而下的关系,从第二篇的层次流程图中可以看出。之前说过串口设备是一种platform device,下面看看串口作为platform device的实现细节。

串口的硬件平台实现smdk2440_map_io()初始化入口:


 

  1. static void __init smdk2440_map_io(void)  
  2. {  
  3.        s3c24xx_init_io(smdk2440_iodesc,ARRAY_SIZE(smdk2440_iodesc));  
  4.        s3c24xx_init_clocks(12000000);  
  5.        s3c24xx_init_uarts(smdk2440_uartcfgs,ARRAY_SIZE(smdk2440_uartcfgs));  //串口初始化  
  6. }  

 

s3c24xx_init_uarts()初始化串口, 主要完成platform device结构相关参数的赋值,如IO,中断,以及platform device私有数据赋值等。

串口platform_device结构:

 

  1. static struct platform_device s3c24xx_uart_device0= {  
  2.        .id           = 0,   // ID号  
  3. };  
  4.    
  5. static struct platform_devices3c24xx_uart_device1 = {  
  6.        .id           = 1,  
  7. };  
  8.    
  9. static struct platform_devices3c24xx_uart_device2 = {  
  10.        .id           = 2,  
  11. };  

 

要完成platform_device参数初始化,主要涉及到一下数据结构:

串口配置数据结构:

 

  1. static struct s3c2410_uartcfgtq2440_uartcfgs[] __initdata = {  
  2.        [0]= {  
  3.               .hwport        =0,  
  4.               .flags          = 0,  
  5.               .ucon          = 0x3c5,  // rx,tx采用中断方式  
  6.               .ulcon         = 0x03,   //数据长度设置为8-bits  
  7.               .ufcon         = 0x51,   //开启FIFO,并设置rx,tx触发字节数  
  8.        },  
  9.        [1]= {  
  10.               .hwport        =1,  
  11.               .flags          = 0,  
  12.               .ucon          = 0x3c5,   
  13.               .ulcon         = 0x03,              
  14. .ufcon          = 0x51,    
  15.        },  
  16.        [2]= {  
  17.               .hwport        =2,  
  18.               .flags          = 0,  
  19.               .ucon          = 0x3c5,  
  20.               .ulcon         = 0x03,  
  21.               .ufcon         = 0x51,  
  22.        }  
  23. };  

 

 串口资源:

 

  1. static struct resources3c2410_uart0_resource[] = {  
  2.        [0]= {  
  3.               .start= S3C2410_PA_UART0,  
  4.               .end   = S3C2410_PA_UART0 + 0x3fff,    
  5.               .flags= IORESOURCE_MEM,         
  6.        },  
  7.        [1]= {  
  8.               .start= IRQ_S3CUART_RX0,  
  9.               .end   = IRQ_S3CUART_ERR0,  
  10.               .flags= IORESOURCE_IRQ,  
  11.        }  
  12. };  
  13.    
  14. struct s3c24xx_uart_resourcess3c2410_uart_resources[] __initdata = {  
  15.        [0]= {  
  16.               .resources      = s3c2410_uart0_resource,  
  17.               .nr_resources  = ARRAY_SIZE(s3c2410_uart0_resource),  
  18.        },  
  19.        [1]= {  
  20.               .resources      = s3c2410_uart1_resource,  
  21.               .nr_resources  = ARRAY_SIZE(s3c2410_uart1_resource),  
  22.        },  
  23.        [2]= {  
  24.               .resources      = s3c2410_uart2_resource,  
  25.               .nr_resources  = ARRAY_SIZE(s3c2410_uart2_resource),  
  26.        },  
  27.        [3]= {  
  28.               .resources      = s3c2410_uart3_resource,  
  29.               .nr_resources  = ARRAY_SIZE(s3c2410_uart3_resource),  
  30.        },  
  31. };  

 

最后通过函数s3c24xx_init_uartdevs()完成 串口platform_device的初始化:

  1. void __init s3c24xx_init_uartdevs(char*name,  
  2.                               struct s3c24xx_uart_resources *res,  
  3.                               struct s3c2410_uartcfg *cfg, int no)  
  4. {//name = s3c2440-uart, res =s3c2410_uart_resources[], cfg = tq2440_uartcfgs, no = 3  
  5.        structplatform_device *platdev;  
  6.        structs3c2410_uartcfg *cfgptr = uart_cfgs;  
  7.        structs3c24xx_uart_resources *resp;  
  8.        intuart;  
  9.    
  10.        memcpy(cfgptr,cfg, sizeof(struct s3c2410_uartcfg) * no);  
  11.    
  12.        for(uart = 0; uart < no; uart++, cfg++, cfgptr++) {  
  13.               platdev= s3c24xx_uart_src[cfgptr->hwport];  //platdev = s3c24xx_uart_device0  
  14.    
  15.               resp= res + cfgptr->hwport;  //resp =s3c2410_uart_resources[] + tq2440_uartcfgs.hwport  
  16.    
  17.               s3c24xx_uart_devs[uart]= platdev; //  
  18.    
  19.               platdev->name= name;  
  20.               platdev->resource= resp->resources;  
  21.               platdev->num_resources= resp->nr_resources;  
  22.    
  23.               platdev->dev.platform_data= cfgptr;//plat_form_data = cfgptr = tq2440_uartcfgs  
  24.        }  
  25.    
  26.        nr_uarts= no;  
  27. }  

 

最终在platform_add_device()中完成注册

 

  1. platform_add_devices(s3c24xx_uart_devs,nr_uarts);  
  2. int platform_add_devices(structplatform_device **devs, int num)  
  3. {  
  4.        inti, ret = 0;  
  5.    
  6.        for(i = 0; i < num; i++) {  
  7.               ret= platform_device_register(devs[i]);  
  8.               if(ret) {  
  9.                      while(--i >= 0)  
  10.                             platform_device_unregister(devs[i]);  
  11.                      break;  
  12.               }  
  13.        }  
  14.    
  15.        return ret;  
  16. }  

 

 

关键字:ARM  Linux  s3c2440  UART 引用地址:ARM-Linux s3c2440 之UART分析(五)

上一篇:ARM-Linux s3c2440 之I2C分析
下一篇:ARM-Linux s3c2440 之UART分析(四)

推荐阅读最新更新时间:2024-03-16 14:56

51单片机入门 - UART串口
对于单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。 1、初步认识 一位一位的发送出去的,要发送 8 次才能发送完一个字节。 STC89C52有两个引脚是专门用来做 UART串行通信的,一个是 P3.0一个是 P3.1,它们还分别有另外的名字叫做 RXD和TXD,由它们组成的通信接口就叫做串行接口,简称串口。 波特率:发送二进制数据位的速率,习惯上用 baud 表示;即我们发送一位二进制数据的持续时间=1/baud。 通信过程:在UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0
[单片机]
51单片机入门 - <font color='red'>UART</font>串口
软银拟收购ARM 英特尔面临更大竞争压力
与英国公司ARM Holdings PLC (ARMH)之间的竞争总会给英特尔公司(Intel Co. ,INTC)带来特殊麻烦,英特尔已多次尝试突破ARM对智能手机芯片技术的封锁,但均以失败告终。这项任务可能很快会变得更加艰巨。 日本软银集团股份有限公司(SoftBank Group Corp. ,9984.TO)周一宣布,计划以320亿美元收购ARM,并承诺对ARM进行更多投资,帮助其在五年内将员工数量增加一倍。ARM获得的额外资金也将被用于收购和内部技术发展,以增强该芯片设计公司在新市场的影响力,比如数据中心设备这个英特尔占据优势的市场。 Linley Group分析师Linley Gwenn称,对于英特尔
[半导体设计/制造]
ARM芯片选择的一般原则
1.1 ARM芯核 如果希望使用WinCE或Linux等操作系统以减少软件开发时间,就需要选择ARM720T以上带有MMU(memory management unit)功能的ARM芯片,ARM720T、StrongARM、ARM920T、ARM922T、ARM946T都带有MMU功能。而 ARM7TDMI没有MMU,不支持Windows CE和大部分的Linux, 但目前有uCLinux等少数几种Linux不需要MMU的支持。 1.2 系统时钟控制器 系统时钟决定了ARM芯片的处理速度。ARM7的处理速度为0.9MIPS/MHz,常见的ARM7芯片系统主时钟为20MHz- 133MHz,ARM9的处理速度为1.1MI
[单片机]
新建的UART0通讯波特率不一致的问题(波特率降低4倍)
如果用Keil ARM的话自动生成的Startup.s中默认VPBDIV=0X00000000,这就导致 Fpclk 为4分频。导致波特率下降四倍。以下为keil中的Startup.s中默认设定的值。;// e VPBDIV Setup ;// i Peripheral Bus Clock Rate ;// o1.0..1 VPBDIV: VPB Clock ;// 0= VPB Clock = CPU Clock / 4 ;// 1= VPB Clock = CPU Clock ;// 2= VPB Clock = CPU Clock / 2 ;// o1.4..5 XCLKDI
[单片机]
详解bootloader的执行流程与ARM Linux启动过程分析
ARM Linux启动过程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后 bootloader的执行流程及 ARM Linux的启动过程。 1、引 言 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些
[单片机]
详解bootloader的执行流程与<font color='red'>ARM</font> <font color='red'>Linux</font>启动过程分析
基于ARM S3C44B0X 的LED显示屏设计
为了简化L ED 显示屏 的 驱动 电路,节约单片机的端口资源,对常见的L ED 显示屏驱动电路进行了改进,全部采用通用的串入并出移位寄存器作为选通驱动,系统全部采用串行数据控制,形成了一种只需4 根信号线的L ED 显示屏驱动电路解决方案,仅需占用单片机的4个I/ O 端口发送串行数据就可以实现正常的 显示 功能,文中给出相应的程序代码。    1 、引言   L ED 显示屏应用十分广泛,是信息传播的有效工具。在某井下矿采设备监测系统中选用了 ARM S3C44B0X 32 位单片机作为CPU ,根据应用要求,监测系统的显示部分使用16 行的单色L ED 显示屏实时显示监测数据。由于系统 外设 较多,端口资源十分
[电源管理]
基于<font color='red'>ARM</font> S3C44B0X 的LED显示屏设计
基于ARM的PWM模块的超声波检测系统的设计
  近年来以微电子学和计算机技术为基础的信息技术飞速发展,超声无损检测仪器也得到了前所未有的发展动力,为了提高检测的可靠性和提高检测效率,研制数字化、智能化、自动化、图像化的超声仪是当今无损检测领域发展的一个重要趋势。而传统的超声波检测仪存在准确性差、精度低、体积大、功耗大、人机界面不友好等问题。而超声波发射与控制电路正是在一种基于ARM的超声波检测系统的基础上,以ARM微控制器为核心,使用C语言编程,方便地实现了发射频率与激励电压脉冲幅度的调节。    1 超声波检测系统的总体设计结构   基于ARM超声波检测系统的总体结构框图,如图1所示。该系统主要由3部分组成:超声波前端发射接收电路、DSP和ARM处理器。   
[单片机]
基于<font color='red'>ARM</font>的PWM模块的超声波检测系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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