linux uart驱动——uart platfrom 注册(三)
一:注册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 注册(三)的更多相关文章
- linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现【转】
本文转自自:http://blog.chinaunix.net/uid-25014876-id-59418.html linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一. ...
- linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59417.html linux设备驱动归纳总结(三):2.字符型设备的操作open.close.rea ...
- linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59416.html linux设备驱动归纳总结(三):1.字符型设备之设备申请 操作系统:Ubunru ...
- linux设备驱动归纳总结(三):3面向对象思想和lseek、container_of、write、read 【转】
linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 转自:http://blog.chinaunix.net/uid-25014876-id-59418.html 一.结构体 ...
- 【Linux开发】linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现
linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一.结构体struct file和struct inode 在之前写的函数,全部是定义了一些零散的全局变量.有没有办法整合 ...
- 【Linux开发】linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write
linux设备驱动归纳总结(三):2.字符型设备的操作open.close.read.write 一.文件操作结构体file_operations 继续上次没讲完的问题,文件操作结构体到底是什么东西, ...
- 【Linux开发】linux设备驱动归纳总结(三):1.字符型设备之设备申请
linux设备驱动归纳总结(三):1.字符型设备之设备申请 操作系统:Ubunru 10.04 实验平台:S3C2440 + linux2.6.29内核 注:在今后驱动程序的学习中经常需要查看内核源代 ...
- linux设备驱动归纳总结(三):7.异步通知fasync【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...
- linux设备驱动归纳总结(三):6.poll和sellct【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-61749.html linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxx ...
- linux设备驱动归纳总结(三):5.阻塞型IO实现【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-60025.html linux设备驱动归纳总结(三):5.阻塞型IO实现 xxxxxxxxxxxxxx ...
随机推荐
- 微信公众平台开发(71)OAuth2.0网页授权-摘抄
微信公众平台开发 OAuth2.0网页授权认证 网页授权获取用户基本信息 作者:方倍工作室 微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友 ...
- 调用已发布的WebService
WebService服务演示 登录http://www.webxml.com.cn
- c语言中的main函数讨论
**从刚开始写C程序,相比大家便开始写main()了.虽然无数的教科书和老师告诉我们main是程序的入口.那么main函数是怎么被调用的,怎么传入参数,返回的内容到哪里了,返回的内容是什么?接下来我们 ...
- linux下终端录制
主要是以下三步: 一.安装软件:curl -sL https://asciinema.org/install | sh 二.录制终端:asciinema rec filename 三.回放终端:asc ...
- 学习环境配置:Manjaro、MSYS2以及常见软件
0.前言 在说Manjaro之前,要先说一下Linux发行版.对于各大发行版而言,内核只有版本的差异,最重要的区别就是包管理系统.常见的包管理系统包括:Pacman,Apt , Yum和Portage ...
- 使用PyQt4制作一个正则表达式测试小工具
最近在做一些网络爬虫的时候,会经常用到正则表达式.为了写出正确的正则表达式,我经常在这个网站上进行测试:Regex Tester.这个页面上面一个输入框输入正则表达式,下面一个输入框输入测试数据,上面 ...
- springBoot 环境
环境约束 jdk1.8:Spring Boot 推荐jdk1.7及以上:maven3.x:maven 3.3以上版本:Apache Maven 3.3.9.IntelliJIDEA2017:Intel ...
- ASP.NET MVC 利用Razor引擎生成静态页
实现原理及步骤: 1.通过ViewEngines.Engines.FindView查找到对应的视图,如果是部分视图,则用:ViewEngines.Engines.FindPartialView: 2. ...
- Java使用HttpURLConnection调用WebService(原始方法)
说明:使用Java原生的HttpURLConnection调用WebService可以免去引入SOA的框架,比如一些CXF框架等.可以使代码足够精简,比如对于一些只调用一两个接口的,这种方式是最适合的 ...
- mysqldump实践
mysqldump mysqldump---逻辑备份,热备 单线程,适合数据量小的库 mysql官方自带的命令行工具 #全库 )mysqldump -uroot -p123456 --sock ...