struct platform_driver 结构体的阅读笔记(3.0.35)
来源:互联网 发布:淘宝卖家怎么上淘抢购 编辑:程序博客网 时间:2024/06/01 21:16
struct platform_driver {/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_device *, pm_message_t state);/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ int (*resume)(struct platform_device *); struct device_driver driver;};
这个结构体在platfoem_driver.h中定义。字面翻译为平台驱动,里面包含了探测,删除,关闭,挂起,重启回调函数,同时包含一个设备驱动结构体。
static int serial_imx_probe(struct platform_device *pdev){struct imx_port *sport;struct imxuart_platform_data *pdata;void __iomem *base;int ret = 0;struct resource *res;sport = kzalloc(sizeof(*sport), GFP_KERNEL);//申请内存,底层是callocif (!sport)return -ENOMEM;res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//第一条注释if (!res) {ret = -ENODEV;goto free;}base = ioremap(res->start, PAGE_SIZE);//ioremap将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问。(这是百度百科参考的CSDN的结果,呃呃)具体不深入if (!base) {ret = -ENOMEM;goto free;}sport->port.dev = &pdev->dev;//下面都是对sport这个结构体的赋值sport->port.mapbase = res->start;sport->port.membase = base;sport->port.type = PORT_IMX,sport->port.iotype = UPIO_MEM;sport->port.irq = platform_get_irq(pdev, 0);sport->rxirq = platform_get_irq(pdev, 0);sport->txirq = platform_get_irq(pdev, 1);sport->rtsirq = platform_get_irq(pdev, 2);sport->port.fifosize = 32;sport->port.ops = &imx_pops;sport->port.flags = UPF_BOOT_AUTOCONF;sport->port.line = pdev->id;init_timer(&sport->timer);sport->timer.function = imx_timeout;sport->timer.data = (unsigned long)sport;sport->clk = clk_get(&pdev->dev, "uart");if (IS_ERR(sport->clk)) {ret = PTR_ERR(sport->clk);goto unmap;}if (uart_at_24)clk_set_parent(sport->clk, clk_get(NULL, "osc"));clk_enable(sport->clk);sport->port.uartclk = clk_get_rate(sport->clk);imx_ports[pdev->id] = sport;pdata = pdev->dev.platform_data;if (pdata && (pdata->flags & IMXUART_HAVE_RTSCTS))sport->have_rtscts = 1;if (pdata && (pdata->flags & IMXUART_USE_DCEDTE))sport->use_dcedte = 1;if (pdata && (pdata->flags & IMXUART_SDMA))sport->enable_dma = 1;#ifdef CONFIG_IRDAif (pdata && (pdata->flags & IMXUART_IRDA))sport->use_irda = 1;#endifif (pdata && pdata->init) {ret = pdata->init(pdev);if (ret)goto clkput;}ret = uart_add_one_port(&imx_reg, &sport->port);if (ret)goto deinit;platform_set_drvdata(pdev, &sport->port);clk_disable(sport->clk);return 0;deinit:if (pdata && pdata->exit)pdata->exit(pdev);clkput:clk_put(sport->clk);clk_disable(sport->clk);unmap:iounmap(sport->port.membase);free:kfree(sport);return ret;}这是imx串口的probe回调函数,看看这个函数做了什么:
1.
platform_get_resource(pdev, IORESOURCE_MEM, 0)看看这个函数干了什么,字面上是获得资源,跟踪之后(略)可以看到是通过传入的platdorm_device返回resource结构体,将resource结构体摘录如下:struct resource { resource_size_t start; resource_size_t end; const char *name; unsigned long flags; struct resource *parent, *sibling, *child;};可以看到这个结构体包含一个起始地址,一个结束地址,一个name一个flages以及一个父节点,兄弟节点,子节点。说明这个资源结构体应该是通过树的形式管理的。
阅读全文
0 0
- struct platform_driver 结构体的阅读笔记(3.0.35)
- struct 结构体笔记
- struct platform_driver
- C++学习笔记二十二 - 简单的结构体struct
- struct platform_device/platform_driver
- struct 结构体的创建
- struct 结构体的大小
- 结构体struct的sizeof
- C#的Struct结构体
- struct结构体的大小
- 结构体struct基本使用笔记
- golang结构体struct学习笔记
- int platform_driver_register(struct platform_driver *drv)
- struct和typedef struct定义结构体方式的不同(彻底弄清楚!!!)
- struct的用法--------C语言结构体(struct)常见使用方法(转载)
- struct和typedef struct(C和C++结构体的声明)
- typedef struct和struct定义结构体的区别
- 结构体定义struct 与 typedef struct 的区别
- reids学习中遇到的一些问题(远程主机无法访问)
- EXAR XR9240
- 谈谈容器镜像运维
- 大型网站架构系列:负载均衡详解(1)
- adbl连接不上 daemon not running. starting it now on port 5037 ADB server didn't ACK
- struct platform_driver 结构体的阅读笔记(3.0.35)
- Harbor开源项目有奖征文活动
- Java创建多级文件夹
- Lua格式化字符串中的空格
- JavaScript 模块的循环加载--阮一峰
- Image-to-Image Translation with Conditional Adversarial Networks 论文翻译
- Matlab安装MinGW-w64编译器
- 网站访问速度测试
- mysql跟踪日志