注册驱动

  • 1. 注册驱动所使用的结构体
  • 2. 注册驱动的源文件
  • 3. 注册驱动的步骤

1. 注册驱动所使用的结构体

驱动注册所使用的结构体是platform_driver,在文件:

/LinuxKernelPath/include/linux/plarform_device.h

中,驱动注册函数platform_driver_register和卸载驱动函数platform_driver_unregister也在该头文件里,plarform_device.h中我们要用到的结构体是:

struct platform_driver {int (*probe)(struct platform_device *);int (*remove)(struct platform_device *);void (*shutdown)(struct platform_device *);int (*suspend)(struct platform_device *, pm_message_t state);int (*resume)(struct platform_device *);struct device_driver driver;const struct platform_device_id *id_table;
};
extern int platform_driver_register(struct platform_driver *);
extern void platform_driver_unregister(struct platform_driver *);

驱动常见的几种状态,初始化、移除、休眠、复位等。
对于结构体的函数:
.prob函数:经过platform_match函数匹配之后,驱动调用的初始化函数。
.remove函数: 移除驱动函数。
.suspend函数: 休眠驱动函数。
.resume函数: 休眠后恢复驱动。
device_driver结构体的参数:name:驱动名字,要和设备名称一样;owner:一般赋值THIS_MODULE

2. 注册驱动的源文件

源代码如下,相应的语句都有注释,以helloworld为例:

/*
Name:HelloWorld Driver Register
Author:Ethan
Version:1.0
Date:2019-11-28
*/
/*包含初始化宏定义的头文件,代码中的module_init和module_exit再次文件中)*/
#include<linux/init.h>
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/
#include<linux/module.h>
/*驱动注册的头文件,包含驱动的结构体以及注册和卸载的函数*/
#include<linux/platform_device.h>/*声明驱动名称*/
#define DRIVER_NAME "helloworld_ctl"/*声明是开源的,没有内核版本限制*/
MODULE_LICENSE("Dual BSD/GPL");
/*声明作者*/
MODULE_AUTHOR("Ethan");/*定义驱动的probe函数*/
static int hello_probe(struct platform_device *pdv){/*打印信息,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "Hello probe! \n");return 0;
}/*定义驱动的remove函数*/
static int hello_remove(struct platform_device *pdv){/*打印信息,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "Hello remove! \n");return 0;
}/*定义驱动的shutdown函数*/
static void hello_shutdown(struct platform_device *pdv){/*打印信息,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "Hello shutdown! \n");}/*定义驱动的suspend函数*/
static int hello_suspend(struct platform_device *pdv){/*打印信息,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "Hello suspend! \n");return 0;
}/*定义驱动的resume函数*/
static int hello_resume(struct platform_device *pdv){/*打印信息,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "Hello resume! \n");return 0;
}/*定义驱动结构体*/
struct platform_driver helloworld_driver = {.probe = hello_probe,.remove = hello_remove,.shutdown = hello_shutdown,.suspend = hello_suspend,.resume = hello_resume,.driver ={.name = DRIVER_NAME,.owner = THIS_MODULE,}
};/*编写初始化函数*/
static int hello_init(void)
{/*定义驱动状态变量*/int driverState;/*打印hello world,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "Hello World! \n");/*注册helloworld驱动*/driverState = platform_driver_register(&helloworld_driver);/*打印驱动注册状态,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "driverState is %d! \n",driverState);return 0;
}//编写卸载函数
static void hello_exit(void)
{/*打印see you,KERN_KMERG表示紧急信息*/printk(KERN_EMERG "See you!/n");/*卸载helloworld驱动*/platform_driver_unregister(&helloworld_driver);}/*初始化函数*/
module_init(hello_init);
/*卸载函数*/
module_exit(hello_exit);

3. 注册驱动的步骤

注册驱动是以module的方式注册的,同注册设备相似:
注册设备的步骤为下:
① 将HelloWorld_Driver.c和Makefile文件移动到linux系统中的某一文件夹下(任意地方或者新建都可以)。
② 执行命令:

make

执行完毕之后可以在该文件夹下生成.ko文件,该文件就是编译生成的驱动。
③ 我们通过开发板来验证该驱动是否编写与编译成功:
—>将.ko文件拷贝到U盘中
—>用命令

mount /dev/sda1 /mnt/disk/

将U盘挂载。
—>可以用命令

ls /mnt/disk/

来列出已经编译成功的.ko文件
—>用加载命令,来加载我们编译好的驱动

insmod /mnt/disk/HelloWorld_Driver.ko

加载结果为:

—>用卸载命令,来卸载刚装好的helloworld驱动

rmmod Device_Module

卸载结果为:

Linux驱动(10)--注册驱动相关推荐

  1. mysql 注册驱动_Mysql注册驱动三种方法 | 学步园

    考量了许久,决定把最近学的jdbc坐下总结,慢慢来吧,一天总结一小点,既然拖了那么久. 好,下面开始总结.(这里以mysql数据库为例) 首先就要说的是jdbc中注册驱动,首先导入对应的包,例如mys ...

  2. 一、linux驱动开发-10.1-MISC驱动

    一.前言 misc驱动也叫杂项驱动,就是某些外设无法进行分类的时候就可以使用MISC驱动.MISC驱动其实就是字符设备驱动,通常嵌套在platform总线驱动中. 二.简介 所有的MISC设备驱动的主 ...

  3. linux网络设备驱动结构体,Linux网络设备驱动之设备驱动的注册与注销(二)

    网络设备驱动的注册与注销由 register_netdev( ) 和 unregister_netdev( ) 函数完成,这两个函数的原型为: int register_netdev(struct n ...

  4. Linux驱动(9)--注册设备

    注册设备 1. 总线设备驱动注册流程 2. 以内核的方式注册设备 3. 以module的方式注册设备 4. 注意 1. 总线设备驱动注册流程 Linux下的总线设备驱动注册流程如下图所示: ① Lin ...

  5. Linux驱动开发 -- touch驱动注册

    Linux i2c驱动开发 – touch 驱动 文章目录 Linux i2c驱动开发 -- touch 驱动 前言 一.i2c 驱动框架 二.Linux的MODULE声明 1. MODULE相关声明 ...

  6. Linux驱动模型之注册驱动

    前言 驱动的话我们关心几个点: 驱动是怎么添加到总线管理的设备链表上的? 注册驱动后,它是怎么和设备匹配,并最终调用驱动中的probe()函数的? 数据结构 首先看下数据结构: struct devi ...

  7. Linux主机驱动与外设驱动分离思想

    - by 宋宝华(Barry Song) 1主机.外设驱动分离的意义 在Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想.举一个简单的例子,假设我们要通过SPI总线访问某外设,在 ...

  8. linux查看网卡的驱动命令行,Linux下查看网卡驱动和版本信息

    Linux下查看网卡驱动和版本信息 查看网卡生产厂商和信号 查看基本信息:lspci 查看详细信息:lspci -vvv # 3个小写的v 查看网卡信息:lspci | grep Ethernet 查 ...

  9. Linux下的硬件驱动——USB设备(下)

    Linux下的硬件驱动--USB设备(下)(驱动开发部分) 文档选项 打印本页 将此页作为电子邮件发送 未显示需要 JavaScript 的文档选项 级别: 初级 赵明, 联想软件设计中心嵌入式研发处 ...

最新文章

  1. MVC页面加载速度优化小记
  2. java opengl es_Java-Android-使用openGL ES绘制3D然后绘制2D
  3. 如何促使团队紧密协作
  4. Python_基础知识储备
  5. redis 3.2.1 centos7
  6. Spring boot拦截器登录检查
  7. 回文字符串(Palindromic_String)
  8. 在一个程序设计里,不同的功能窗口有着相似的功能实现方式,可采用设计模式---模板方法模式
  9. 网络管理员的爱情,不解释...
  10. [剑指offer][JAVA]面试题第[20]题[表示数值的字符串][状态机]
  11. 详解GPU技术关键参数和应用场景
  12. Oracle 10g RAC 升级(CPU Update)之--升级CRS
  13. python 可视化 画直线_用Python画江苏省地图,实现各地级市数据可视化
  14. 14 、软件测试-MySQL的基本使用方法-增删改查
  15. PHP运行Python脚本
  16. 湖北省最新测绘资质审批拟批准结果已公示,看看有没有你们公司
  17. win7无法打开计算机共享文件夹,Win7共享文件夹无法访问怎么办?Win7共享文件夹无法访问解决方法...
  18. 如何搭建一个像01资源网那样的付费资源网站?教你用wordpress快速搭建!
  19. 南华大学2022第五届网络安全竞赛wp
  20. Ngrok的外网映射

热门文章

  1. Jenkins ssh 发布jar 时区不对
  2. linux zip包解压乱码
  3. bat执行java文件_.bat文件执行java程序
  4. 记录方法用时_知识无穷,学以致用才是关键!四个方法教你学以致用
  5. Windows Server 2008 R2 安全加固
  6. slz-linux虚拟机的安装-VMware
  7. 自己为什么注册博客(csdn讲师:Array)
  8. 由已打开的文件读取数据---read
  9. Flutter 实现微信摇一摇的功能 Flutter 加速度感应
  10. 如何让DIV模块随着页面固定和不固定