我的内核学习笔记2:platform设备模型
说实话,我做这个例子之前,我对linux的platform设备、platform驱动了解不多,只知道有这些东西,但没概念。上网搜索了一些资料,并下了点功夫跟踪了内核源代码,虽然不能说吃透了原理,但也不至于像以前那样一无所知。这篇文章主要是说一下一个简单的驱动例子。
为了明确层次,不把所有代码都放到一个文件中,这个例子中,分别有设备文件simplechar_dev.c,驱动文件simplechar_drv.c以及共用的头文件simplechar.h。为了避免例子十分的简单,额外添加了些结构体,也在代码 中对这些结构体做了测试。总之,可以认为这是一个platform的模板吧。
simplechar.h文件是自定义的结构体:
#ifndef SIMPLECHAR_H
#define SIMPLECHAR_Hstruct simplechar_platdata {char *name;
};#endif
simplechar_dev.c文件的代码仅仅与“设备”有关,即定义这个设备有哪些特性(名称、私有数据,等):
/*** @file simplechar_dev.c* @author Late Lee <latelee@163.com>* @date Tue Nov 12 21:07:03 2013* * @brief * * */#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>#include "simplechar.h"// device
static struct simplechar_platdata foo_pdata = {.name = "gotohell",
};// 避免删掉模块时出现警告
static void simplechar_dev_release(struct device* dev)
{printk(KERN_NOTICE "do %s case of: Device xxx does not have a release() function, it is broken and must be fixed.\n", __func__);return;
}// 另一文件要使用到,此处不能为static
// 在/sys/devices/platform/生成目录:simplechar
struct platform_device simplechar_device = {.name = "simplechar",.id = -1, // 注:如何为1,则生成目录:simplechar.1.dev = {.platform_data = &foo_pdata,.release = &simplechar_dev_release,},
};
simplechar_drv.c文件主要实现了“驱动”,驱动的主要代码集中于此:
/*** @file simplechar_drv.c* @author Late Lee <latelee@163.com>* @date Tue Nov 12 21:07:15 2013* * @brief platform模型示例* * @note 仅用于insmod和rmmod的测试,不具备字符设备特征*/
/***/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>#include "simplechar.h"// device
extern struct platform_device simplechar_device;// our own data
struct simplechar {int id;struct simplechar_platdata *pdata;char buffer[16];
};static inline struct simplechar *pdev_to_owndata(struct platform_device *dev)
{return platform_get_drvdata(dev);
}static int simplechar_remove(struct platform_device *dev)
{struct simplechar *foo = pdev_to_owndata(dev);// 释放自定义数据空间kfree(foo);return 0;
}static int simplechar_test(struct platform_device *dev)
{struct simplechar *foo = NULL;foo = pdev_to_owndata(dev);printk(KERN_NOTICE "%s: get id: %d data: %s\n", __func__, foo->id, foo->buffer);return 0;
}static int simplechar_probe(struct platform_device *dev)
{struct simplechar_platdata *pdata = dev->dev.platform_data;struct simplechar *foo = NULL;int ret = 0;printk(KERN_NOTICE "in %s our data name: %s\n", __func__, pdata->name);// 申请自定义数据空间foo = kzalloc(sizeof(struct simplechar), GFP_KERNEL);if (foo == NULL) {dev_err(&dev->dev, "No memory for device\n");return -ENOMEM;}// 设置自定义结构体数据platform_set_drvdata(dev, foo);foo->id = 250;strcpy(foo->buffer, "hello world");// 简单测试simplechar_test(dev);return ret;
}// driver
static struct platform_driver simplechar_driver = {.probe = simplechar_probe,.remove = simplechar_remove,.driver = {.name = "simplechar",.owner = THIS_MODULE,},
};static int __init simplechar_drv_init(void)
{int ret = 0;printk(KERN_NOTICE "in %s\n", __func__);// 先注册设备(适用于静态定义设备结构体)ret = platform_device_register(&simplechar_device);if (ret){printk(KERN_NOTICE "platform_device_register failed!\n");return ret;}// 再注册驱动ret = platform_driver_register(&simplechar_driver);if (ret){printk(KERN_NOTICE "platform_driver_register failed!\n");return ret;}printk("%s() ok\n", __func__);return ret;
}static void __exit simplechar_drv_exit(void)
{printk(KERN_NOTICE "in %s\n", __func__);// 先卸载驱动platform_driver_unregister(&simplechar_driver);// 再卸载设备platform_device_unregister(&simplechar_device);
}module_init(simplechar_drv_init);
module_exit(simplechar_drv_exit);MODULE_AUTHOR("Late Lee");
MODULE_DESCRIPTION("Simple platform driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:simplechar");
我的内核学习笔记2:platform设备模型相关推荐
- Windows x64内核学习笔记(五)—— KPTI(未完待续)
Windows x64内核学习笔记(五)-- KPTI(未完待续) KPTI 实验一:构造IDT后门并读取Cr3 参考资料 KPTI 描述:KPTI(Kernel page-table isolati ...
- 《寒江独钓》内核学习笔记
<寒江独钓>内核学习笔记(1)-- IRP - .Little Hann 时间 2013-11-30 15:40:00 博客园_.Little Hann原文 http://www.cn ...
- Windows x64内核学习笔记(四)—— 9-9-9-9-12分页
Windows x64内核学习笔记(四)-- 9-9-9-9-12分页 前言 9-9-9-9-12分页 实验一:线性地址转物理地址 页表基址 定位基址 PTE to PXE 实验二:通过页表基址定位各 ...
- Windows x64内核学习笔记(三)—— SMEP SMAP
Windows x64内核学习笔记(三)-- SMEP & SMAP SMEP & SMAP 实验:构造IDT后门 第一步:编译以下代码 第二步:构造IDT后门 第三步:运行程序 第四 ...
- Windows x64内核学习笔记(一)—— 环境与配置
Windows x64内核学习笔记(一)-- 环境与配置 前言 新特性 基础要求 实验环境 Guest Win10配置 问题解决 参考资料 前言 之前,跟着海哥学习了windows内核的一些机制,包括 ...
- 操作系统进程学习(Linux 内核学习笔记)
操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...
- 我的内核学习笔记7:Intel LPC驱动lpc_ich分析
接触这么久的内核代码,还没有真正分析一个完整的驱动源码,都是零零散散写只言片字.本文就作一个尝试,写一写Linux内核源码分析层面的文章. 本文介绍基于Intel baytrail系列的e3800系列 ...
- 我的内核学习笔记5:proc目录文件创建及读写
上一篇内核学习笔记<我的内核学习笔记4:sysfs学习>是2013年写的,彼时至今,随着工作的展开和安排,内核方面的知识可谓突飞猛进,当然,其它方面亦是如此.关于内核方面,积累的笔记大大小 ...
- Windows x64内核学习笔记(二)—— IA-32e模式
Windows x64内核学习笔记(二)-- IA-32e模式 IA-32e模式 模式检测 强制平坦段 任务切换 中断门描述符 FS / GS 模式切换 32位程序进内核 64位程序进内核 实验:模式 ...
- OP-TEE内核学习笔记(一)(安全存储)—— 安全存储 GP API
存储文件基础操作 一. 安全存储GP API 1.1 `TEE_CreatePersistentObject` 1.2 `TEE_CloseAndDeletePersistentObject` 1.3 ...
最新文章
- 13个 ASP.NET MVC 的扩展
- JWT 入坑爬坑指南
- 面向对象写单片机程序-程序分层
- 计算机网络.doc,计算机网络network.doc
- java彩色的世界_JAVA真彩色转256色的实现
- 平台服务器测试3—接口测试工具实现
- SAP Spartacus storefront 模块的实现位置
- 技能UP:SAP OBYC自动记账的实例说明(含value String应用说明)
- 学python心得体会800字-python 学习心得
- python中json模块_python中的json模块
- html音乐播放器收起展开代码,JS模拟酷狗音乐播放器收缩折叠关闭效果代码
- 超简单的HIDPI设置
- vegas视频软件使用教程和笔记
- 微信小程序转发功能详解
- 大多数计算机专业研究生的三年是怎么过的?
- 手把手教你安装MINIGUI编程环境 (MINIGUI版本3.2.0)
- Java基础知识面试题(2021最新版)
- angular拖动插件——ng-drag、ng-drop
- 第5期-通过飞卢小说网爬取小说
- 可替换STM23G031的32位单片机
热门文章
- 小马智行完成D轮融资首次交割 估值达85亿美元
- 华为天才少年1万元自制机械臂:能给葡萄缝针!
- 微信公布9月朋友圈十大谣言:包括接通电话手机的钱就会被转走
- 大学生起诉小米获赔流量费1元
- 张大奕网店关联公司被行政处罚:因以不合格产品冒充合格产品
- 瑞幸回应申请破产:这是一个让重生之路又进一步的好消息
- 特斯拉副总裁回应“质量不合格”报道:离谱 已准备起诉
- 最硬核交通信号灯上线:专治老司机们的这个“臭毛病”!
- 再见了!微软宣布停止服务支持:一代经典系统退出舞台
- 这次是真香了!iPhone 11一个月卖出1200万部 苹果加大产量