驱动变量值异常

JiMoKuangXiangQu 2017-10-19 07:17:53
arch/arm/mach-xxx/board-xxx.c
static struct xxx_device_data xxx_dev_data = {
.m = {
.x = 17,
},
};

static struct platform_device xxx_dev = {
.name = "xxx-dev-name",
.id = -1,
.dev = {
.platform_data = &xxx_dev_data,
},
};

void board_xxx_init(void)
{
struct xxx_device_data *pdata;

...
pdata = &xxx_dev.dev.platform_data;
pr_info("%s(before): @%p, x = %d\n", __func__, pdata, pdata->x); // 输出正常,x为17
platform_register_device(&xxx_dev.dev.platform_data);
pr_info("%s(after): x = %d\n", __func__, pdata->x); // 输出正常,x为17
...
}


drivers/base/platform.c
int platform_device_register(struct platform_device *pdev)
{
if (!strcmp(pdev->name, "xxx-dev-name")) {
struct xxx_device_data *pdata = pdev->dev.platform_data;
pr_info("%s: %s, @%p, x = %d\n", __func__, pdev->name, pdata, pdata->x); // 输出除x为0外,其他正常
}
...
}


board_xxx_init()函数中输出结果:
 board_xxx_init(before): @c0bf6188, x = 17
board_xxx_init(after): x = 17


platform_device_register()函数中输出结果:
platform_device_register: xxx-dev-name, @c0bf6188, x = 0


为什么platform_device_register()函数输出结果中输出结果中的x为0?
在调用platform_device_register()函数前后的输出证明x的值没有被改变,所有的输出也证明platform_data指向的地址
也没有被修改,都是c0bf6188
那有什么可能造成了这个问题呢?请各位支招.
...全文
296 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
JiMoKuangXiangQu 2017-10-20
  • 打赏
  • 举报
回复
已解决,问题很简单: 两个头文件对同一数据结构进行了定义,且定义不同; 同时不同的c文件中包含了不同的头文件,导致了看到的数据结构定义不一致.
JiMoKuangXiangQu 2017-10-20
  • 打赏
  • 举报
回复
请大家给点意见和建议. 我做了进一步验证,当把 platform_register_device() 的移到arch/arm/mach-xxx/board-xxx.c中时,输出x的值正常. 一旦xxx_dev变量和platform_register_device()不在同一个文件内时,x在platform_register_device()中的输出就不正常了.

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧