Driver: to_platform_device 分析
来源:互联网 发布:苹果7蜂窝移动网络设置 编辑:程序博客网 时间:2024/06/15 03:45
dev == s3c_device_lcd.dev
->
struct platform_device *pdev = to_platform_device(dev);
->
展开to_platform_device(dev);
#define to_platform_device(x) container_of((x), struct platform_device, dev)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
->如上是linux系统中,常用的查找结构体变量的起始地址的方法。
过程简单,但很实用。附在后面的说明函数已编译验证过,可以比较细致说明这个问题。
着重理解两点即可:
1)to_platform_device(x) ,x是什么?是一个地址,实际上即为:s3c_device_lcd.dev。
2)offsetof(type,member)实际上就是 结构体重 dev到s3c_device_lcd起始处的偏移量而已。
通过如上两点,便可得知 s3c_device_lcd 地址。
struct platform_device s3c_device_lcd = {
.name = "s3c2410-lcd",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_lcd_resource),
.resource = s3c_lcd_resource,
.dev = {
.dma_mask = &s3c_device_lcd_dmamask,
.coherent_dma_mask = 0xffffffffUL
}
};
附程序:
#include "stdafx.h"
#include<stdio.h>
struct student{
char name[20];
char sex;
}stu={"zhangsan",'m'};
main()
{
struct student *stu_ptr; //存储container_of宏的返回值
int offset; //存储offsetof宏的返回值
//下面三行代码等同于 container_of(&stu.sex,struct student, sex )参数带入的情形
const typeof(((struct student*)0)->sex) *_mptr = &stu.sex;
//首先定义一个 _mptr指针, 类型为struct student结构体中sex成员的类型
//typeof 为获取(((struct student*)0)->sex)的类型,此处此类型为char
//((struct student*)0)在offsetof处讲解
offset = (int)(&((struct student *)0)->sex);
/*((struct student*)0)为 把 0地址 强制转化为指向student结构体类型的指针
该指针从地址 0 开始的 21个字节用来存放name 与 sex(char name〔20〕与 char sex共21字节)
sex存放在第20个字节出(从0字节开始)
&((struct student *)0)->sex 取出sex地址(此处即为20) 并强制转化为整形
所以offset为20,后面的printf结果将证明这一点*/
stu_ptr = (struct student *)((char*)_mptr - offset);
/*((char*)_mptr - offset)此处先把_mptr指针转化为字符形指针
(为什么这么做呢? 如果_mptr为整形指针 _mptr - offset 相当于减去 sizeof(int)*offset个字节)
减去 offset值 相当于 得到_mptr所在结构体的首地址(即stu的地址)
然后我们把 该地址 强制转化为 struct student类型即可正常使用了*/
printf("offsetof stu.sex = %d/n",offset);
printf("stu_ptr->name:%s/tstu_ptr->sex:%c/n", stu_ptr->name, stu_ptr->sex);
return 0;
}
- Driver: to_platform_device 分析
- linux paltform驱动中的to_platform_device
- SD Driver分析
- colinux-driver简单分析
- pmem driver代码分析
- Android binder driver 分析
- uvc-driver.c分析
- hive Driver 流程分析
- wince 2410 UDC driver 分析
- wince 2410 UDC driver 分析
- linux NandFlash driver 详细分析
- Android RIL Driver 源码分析
- USB Skeleton driver 分析记录
- LINUX SD card driver分析
- UEFI PCI Bus Driver分析
- Nova Baremetal Driver深入分析
- USB-FS-Device-Driver分析
- NVME Driver分析之nvme_submit_sync_cmd
- 关于朗格朗日乘子
- 如何在Hyper-V里新建虚拟机
- Java里的拆箱和装箱
- Java AWT基础及布局管理
- linux内核的串口驱动架构之我的形象理解
- Driver: to_platform_device 分析
- 网络技术与思想漫谈
- ARM中断返回PC值分析
- 编译ffmpeg x86所需要的库
- 使用getBoundingClientRect()方法获取元素距离浏览器周边的位置
- CWnd* pBtn5->ShowWindow(0);
- Android Parcelable和Serializable的区别
- linux字符设备驱动程序设计概述
- 第七次作业