说实话,我做这个例子之前,我对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设备模型相关推荐

  1. Windows x64内核学习笔记(五)—— KPTI(未完待续)

    Windows x64内核学习笔记(五)-- KPTI(未完待续) KPTI 实验一:构造IDT后门并读取Cr3 参考资料 KPTI 描述:KPTI(Kernel page-table isolati ...

  2. 《寒江独钓》内核学习笔记

    <寒江独钓>内核学习笔记(1)-- IRP - .Little Hann 时间 2013-11-30 15:40:00  博客园_.Little Hann原文  http://www.cn ...

  3. Windows x64内核学习笔记(四)—— 9-9-9-9-12分页

    Windows x64内核学习笔记(四)-- 9-9-9-9-12分页 前言 9-9-9-9-12分页 实验一:线性地址转物理地址 页表基址 定位基址 PTE to PXE 实验二:通过页表基址定位各 ...

  4. Windows x64内核学习笔记(三)—— SMEP SMAP

    Windows x64内核学习笔记(三)-- SMEP & SMAP SMEP & SMAP 实验:构造IDT后门 第一步:编译以下代码 第二步:构造IDT后门 第三步:运行程序 第四 ...

  5. Windows x64内核学习笔记(一)—— 环境与配置

    Windows x64内核学习笔记(一)-- 环境与配置 前言 新特性 基础要求 实验环境 Guest Win10配置 问题解决 参考资料 前言 之前,跟着海哥学习了windows内核的一些机制,包括 ...

  6. 操作系统进程学习(Linux 内核学习笔记)

    操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...

  7. 我的内核学习笔记7:Intel LPC驱动lpc_ich分析

    接触这么久的内核代码,还没有真正分析一个完整的驱动源码,都是零零散散写只言片字.本文就作一个尝试,写一写Linux内核源码分析层面的文章. 本文介绍基于Intel baytrail系列的e3800系列 ...

  8. 我的内核学习笔记5:proc目录文件创建及读写

    上一篇内核学习笔记<我的内核学习笔记4:sysfs学习>是2013年写的,彼时至今,随着工作的展开和安排,内核方面的知识可谓突飞猛进,当然,其它方面亦是如此.关于内核方面,积累的笔记大大小 ...

  9. Windows x64内核学习笔记(二)—— IA-32e模式

    Windows x64内核学习笔记(二)-- IA-32e模式 IA-32e模式 模式检测 强制平坦段 任务切换 中断门描述符 FS / GS 模式切换 32位程序进内核 64位程序进内核 实验:模式 ...

  10. OP-TEE内核学习笔记(一)(安全存储)—— 安全存储 GP API

    存储文件基础操作 一. 安全存储GP API 1.1 `TEE_CreatePersistentObject` 1.2 `TEE_CloseAndDeletePersistentObject` 1.3 ...

最新文章

  1. 13个 ASP.NET MVC 的扩展
  2. JWT 入坑爬坑指南
  3. 面向对象写单片机程序-程序分层
  4. 计算机网络.doc,计算机网络network.doc
  5. java彩色的世界_JAVA真彩色转256色的实现
  6. 平台服务器测试3—接口测试工具实现
  7. SAP Spartacus storefront 模块的实现位置
  8. 技能UP:SAP OBYC自动记账的实例说明(含value String应用说明)
  9. 学python心得体会800字-python 学习心得
  10. python中json模块_python中的json模块
  11. html音乐播放器收起展开代码,JS模拟酷狗音乐播放器收缩折叠关闭效果代码
  12. 超简单的HIDPI设置
  13. vegas视频软件使用教程和笔记
  14. 微信小程序转发功能详解
  15. 大多数计算机专业研究生的三年是怎么过的?
  16. 手把手教你安装MINIGUI编程环境 (MINIGUI版本3.2.0)
  17. Java基础知识面试题(2021最新版)
  18. angular拖动插件——ng-drag、ng-drop
  19. 第5期-通过飞卢小说网爬取小说
  20. 可替换STM23G031的32位单片机

热门文章

  1. 小马智行完成D轮融资首次交割 估值达85亿美元
  2. 华为天才少年1万元自制机械臂:能给葡萄缝针!
  3. 微信公布9月朋友圈十大谣言:包括接通电话手机的钱就会被转走
  4. 大学生起诉小米获赔流量费1元
  5. 张大奕网店关联公司被行政处罚:因以不合格产品冒充合格产品
  6. 瑞幸回应申请破产:这是一个让重生之路又进一步的好消息
  7. 特斯拉副总裁回应“质量不合格”报道:离谱 已准备起诉
  8. 最硬核交通信号灯上线:专治老司机们的这个“臭毛病”!
  9. 再见了!微软宣布停止服务支持:一代经典系统退出舞台
  10. 这次是真香了!iPhone 11一个月卖出1200万部 苹果加大产量