一:注册platform device

注册一个platfrom device一般需要初始化两个内容,设备占用的资源resource和设备私有数据dev.platfrom_data。设备的resource占用的资源主要包含两个方面:IO内存和IRQ资源信息,有时也包含DMA。

resource结构:

   1:  struct resource {
   2:      resource_size_t start;//定义资源的起始地址 
   3:      resource_size_t end;//定义资源的结束地址
   4:      const char *name;//定义资源的名称 
   5:      unsigned long flags;//定义资源的类型,比如MEM,IO,IRQ,DMA类型
   6:      struct resource *parent, *sibling, *child;//资源链表指针 
   7:  };

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

笔者当前的君正board有三个串口:

   1:  #ifdef CONFIG_SERIAL_JZ47XX_UART0
   2:  /* UART ( uart controller) */
   3:  static struct resource jz_uart0_resources[] = {
   4:      [0] = {
   5:          .start          = UART0_IOBASE,
   6:          .end            = UART0_IOBASE + 0x1000 - 1,
   7:          .flags          = IORESOURCE_MEM,
   8:      },
   9:      [1] = {
  10:          .start          = IRQ_UART0,
  11:          .end            = IRQ_UART0,
  12:          .flags          = IORESOURCE_IRQ,
  13:      },
  14:  #ifdef CONFIG_SERIAL_JZ47XX_UART0_DMA
  15:      [2] = {
  16:          .start          = JZDMA_REQ_UART0,
  17:          .flags          = IORESOURCE_DMA,
  18:      },
  19:  #endif
  20:  };
  21:   
  22:  struct platform_device jz_uart0_device = {
  23:      .name = "jz-uart",
  24:      .id = 0,
  25:      .num_resources  = ARRAY_SIZE(jz_uart0_resources),
  26:      .resource       = jz_uart0_resources,
  27:  };
  28:  #endif
  29:  #ifdef CONFIG_SERIAL_JZ47XX_UART1
  30:  static struct resource jz_uart1_resources[] = {
  31:      [0] = {
  32:          .start          = UART1_IOBASE,
  33:          .end            = UART1_IOBASE + 0x1000 - 1,
  34:          .flags          = IORESOURCE_MEM,
  35:      },
  36:      [1] = {
  37:          .start          = IRQ_UART1,
  38:          .end            = IRQ_UART1,
  39:          .flags          = IORESOURCE_IRQ,
  40:      },
  41:  #ifdef CONFIG_SERIAL_JZ47XX_UART1_DMA
  42:      [2] = {
  43:          .start          = JZDMA_REQ_UART1,
  44:          .flags          = IORESOURCE_DMA,
  45:      },
  46:  #endif
  47:  };
  48:  struct platform_device jz_uart1_device = {
  49:      .name = "jz-uart",
  50:      .id = 1,
  51:      .num_resources  = ARRAY_SIZE(jz_uart1_resources),
  52:      .resource       = jz_uart1_resources,
  53:  };
  54:  #endif
  55:  #ifdef CONFIG_SERIAL_JZ47XX_UART2
  56:  static struct resource jz_uart2_resources[] = {
  57:      [0] = {
  58:          .start          = UART2_IOBASE,
  59:          .end            = UART2_IOBASE + 0x1000 - 1,
  60:          .flags          = IORESOURCE_MEM,
  61:      },
  62:      [1] = {
  63:          .start          = IRQ_UART2,
  64:          .end            = IRQ_UART2,
  65:          .flags          = IORESOURCE_IRQ,
  66:      },
  67:  #ifdef CONFIG_SERIAL_JZ47XX_UART2_DMA
  68:      [2] = {
  69:          .start          = JZDMA_REQ_UART2,
  70:          .flags          = IORESOURCE_DMA,
  71:      },
  72:  #endif
  73:  };
  74:   
  75:  struct platform_device jz_uart2_device = {
  76:      .name = "jz-uart",
  77:      .id = 2,
  78:      .num_resources  = ARRAY_SIZE(jz_uart2_resources),
  79:      .resource       = jz_uart2_resources,
  80:  };
  81:  #endif

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

platform_device_register(&jz_uartXX_device);

注册成功后:(多个device)

ls /sys/bus/platform/devices/
jz-uart.0/  jz-uart.2/

二:注册platfrom driver

   1:  /* serial platfrom driver */
   2:  static struct platform_driver serial_jz47xx_driver = {
   3:      .probe          = serial_jz47xx_probe,
   4:      .remove         = serial_jz47xx_remove,
   5:   
   6:      .driver        = {
   7:          .name    = "jz-uart",
   8:          .owner    = THIS_MODULE,
   9:  #ifdef CONFIG_PM
  10:          .pm    = &serial_jz47xx_pm_ops,
  11:  #endif
  12:      },
  13:  };
  14:   
  15:  int __init serial_jz47xx_init(void)
  16:  {
  17:      int ret;
  18:      /* 功能:uart_register_driver用于将串口驱动uart_driver注册到内核(串口核心层)中,
  19:                  通常在模块初始化函数调用该函数。
  20:        * 参数 drv:要注册的uart_driver
  21:        * 返回值:  成功,返回0;否则返回错误码
  22:       */
  23:      ret = uart_register_driver(&serial_jz47xx_reg);
  24:      if (ret != 0)
  25:          return ret;
  26:   
  27:      /* 注册serial platfrom驱动 */
  28:      ret = platform_driver_register(&serial_jz47xx_driver); 
  29:      if (ret != 0)
  30:          uart_unregister_driver(&serial_jz47xx_reg);
  31:   
  32:      return ret;
  33:  }
  34:   
  35:  void __exit serial_jz47xx_exit(void)
  36:  {
  37:      platform_driver_unregister(&serial_jz47xx_driver);
  38:      uart_unregister_driver(&serial_jz47xx_reg);
  39:  }
  40:   
  41:   
  42:  #ifdef CONFIG_EARLY_INIT_RUN
  43:  rootfs_initcall(serial_jz47xx_init);/*先于module注册*/
  44:   
  45:  #else
  46:  module_init(serial_jz47xx_init);
  47:   
  48:  #endif
  49:   
  50:  module_exit(serial_jz47xx_exit);
  51:   
  52:  MODULE_LICENSE("GPL");
  53:  MODULE_ALIAS("platform:jz47xx-uart");

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

注册成功后:(一个driver对应多个device)

ls /sys/bus/platform/drivers/jz-uart/
bind       jz-uart.0  jz-uart.2  uevent     unbind

linux uart驱动——uart platfrom 注册(三)的更多相关文章

  1. linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现【转】

    本文转自自:http://blog.chinaunix.net/uid-25014876-id-59418.html linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一. ...

  2. linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59417.html linux设备驱动归纳总结(三):2.字符型设备的操作open.close.rea ...

  3. linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59416.html linux设备驱动归纳总结(三):1.字符型设备之设备申请 操作系统:Ubunru ...

  4. linux设备驱动归纳总结(三):3面向对象思想和lseek、container_of、write、read 【转】

    linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 转自:http://blog.chinaunix.net/uid-25014876-id-59418.html 一.结构体 ...

  5. 【Linux开发】linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现

    linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一.结构体struct file和struct inode 在之前写的函数,全部是定义了一些零散的全局变量.有没有办法整合 ...

  6. 【Linux开发】linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write

    linux设备驱动归纳总结(三):2.字符型设备的操作open.close.read.write 一.文件操作结构体file_operations 继续上次没讲完的问题,文件操作结构体到底是什么东西, ...

  7. 【Linux开发】linux设备驱动归纳总结(三):1.字符型设备之设备申请

    linux设备驱动归纳总结(三):1.字符型设备之设备申请 操作系统:Ubunru 10.04 实验平台:S3C2440 + linux2.6.29内核 注:在今后驱动程序的学习中经常需要查看内核源代 ...

  8. linux设备驱动归纳总结(三):7.异步通知fasync【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...

  9. linux设备驱动归纳总结(三):6.poll和sellct【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-61749.html linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxx ...

  10. linux设备驱动归纳总结(三):5.阻塞型IO实现【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-60025.html linux设备驱动归纳总结(三):5.阻塞型IO实现 xxxxxxxxxxxxxx ...

随机推荐

  1. 洛谷 P1174 打砖块

    题目描述 小红很喜欢玩一个叫打砖块的游戏,这个游戏的规则如下: 在刚开始的时候,有n行*m列的砖块,小红有k发子弹.小红每次可以用一发子弹,打碎某一列当前处于这一列最下面的那块砖,并且得到相应的得分. ...

  2. javaScript防止拦截新窗口打开页面

    原文发布时间为:2009-05-04 -- 来源于本人的百度文章 [由搬家工具导入] 兼容IE.FF.GOOGLE。防止拦截。。。。 <html xmlns="http://www.w ...

  3. [论文]A Link-Based Approach to the Cluster Ensemble Problem

    论文作者:Natthakan Iam-On, Tossapon Boongoen, Simon Garrett, and Chris Price 下次还是在汇报前先写了论文总结,不然有些点汇报时容易忘 ...

  4. 例说linux内核与应用数据通信系列【转】

    转自:http://blog.csdn.net/shallnet/article/details/47865169 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章对您有用,请点击文 ...

  5. uva 1442:Cave(贪心)

    题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可 ...

  6. 将Map<String, List<Map<String,Object>>>进行排序

    首先我贴上我的代码,刚开始我也不知道怎么排序还写了一些方法,最后请教群里的大神解决了 public Map<String, List<Map<String,Object>> ...

  7. asp.net core 2.1 将控制器抽离到类库中

    startup.cs的ConfigureServices中添加: public void ConfigureServices(IServiceCollection services) { var ma ...

  8. 初学Docker容器网络不得不看的学习笔记

    一.关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  9. 安全性测试入门 (四):Session Hijacking 用户会话劫持的攻击和防御

    本篇继续对于安全性测试话题,结合DVWA进行研习. Session Hijacking用户会话劫持 1. Session和Cookies 这篇严格来说是用户会话劫持诸多情况中的一种,通过会话标识规则来 ...

  10. 树的直径新求法、codeforces 690C3 Brain Network (hard)

    树的直径新求法 讲解题目 今天考了一道题目,下面的思路二是我在考场上原创,好像没人想到这种做法,最原始的题目,考场上的题目是这样的: 你现在有1 个节点,他的标号为1,每次加入一个节点,第i 次加入的 ...