您的位置 首页 观点

ARM-Linux s3c2440 之UART剖析(五)

从上面四篇介绍文章中,已经清楚了串口设备与串口驱动实现的各层次关系流程。是一种从上而下的关系,从第二篇的层次流程图中可以看出。之前…

从上面四篇介绍文章中,现已清楚了串口设备与串口驱动完结的各层次联系流程。是一种从上而下的联系,从第二篇的层次流程图中能够看出。之前说过串口设备是一种platform device,下面看看串口作为platform device的完结细节。

串口的硬件渠道完结smdk2440_map_io()初始化进口:

  1. staticvoid__initsmdk2440_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. staticstructplatform_devices3c24xx_uart_device0={
  2. .id=0,//ID号
  3. };
  4. staticstructplatform_devices3c24xx_uart_device1={
  5. .id=1,
  6. };
  7. staticstructplatform_devices3c24xx_uart_device2={
  8. .id=2,
  9. };

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

串口装备数据结构:

  1. staticstructs3c2410_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. staticstructresources3c2410_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. structs3c24xx_uart_resourcess3c2410_uart_resources[]__initdata={
  14. [0]={
  15. .resources=s3c2410_uart0_resource,
  16. .nr_resources=ARRAY_SIZE(s3c2410_uart0_resource),
  17. },
  18. [1]={
  19. .resources=s3c2410_uart1_resource,
  20. .nr_resources=ARRAY_SIZE(s3c2410_uart1_resource),
  21. },
  22. [2]={
  23. .resources=s3c2410_uart2_resource,
  24. .nr_resources=ARRAY_SIZE(s3c2410_uart2_resource),
  25. },
  26. [3]={
  27. .resources=s3c2410_uart3_resource,
  28. .nr_resources=ARRAY_SIZE(s3c2410_uart3_resource),
  29. },
  30. };

终究经过函数s3c24xx_init_uartdevs()完结 串口platform_device的初始化:

  1. void__inits3c24xx_init_uartdevs(char*name,
  2. structs3c24xx_uart_resources*res,
  3. structs3c2410_uartcfg*cfg,intno)
  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. memcpy(cfgptr,cfg,sizeof(structs3c2410_uartcfg)*no);
  10. for(uart=0;uart
  11. platdev=s3c24xx_uart_src[cfgptr->hwport];//platdev=s3c24xx_uart_device0
  12. resp=res+cfgptr->hwport;//resp=s3c2410_uart_resources[]+tq2440_uartcfgs.hwport
  13. s3c24xx_uart_devs[uart]=platdev;//
  14. platdev->name=name;
  15. platdev->resource=resp->resources;
  16. platdev->num_resources=resp->nr_resources;
  17. platdev->dev.platform_data=cfgptr;//plat_form_data=cfgptr=tq2440_uartcfgs
  18. }
  19. nr_uarts=no;
  20. }

终究在platform_add_device()中完结注册

  1. platform_add_devices(s3c24xx_uart_devs,nr_uarts);
  2. intplatform_add_devices(structplatform_device**devs,intnum)
  3. {
  4. inti,ret=0;
  5. for(i=0;i
  6. ret=platform_device_register(devs[i]);
  7. if(ret){
  8. while(–i>=0)
  9. platform_device_unregister(devs[i]);
  10. break;
  11. }
  12. }
  13. returnret;
  14. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/264932.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部