ARM驱动学习之4小结

ARM驱动学习之4小结

cpp 复制代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>

#define DEVICE_NAME "hello_ctl123"

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("TOPEET");

static long hello_ioctl(struct file *file,unsigned int cmd,unsigned long arg){
	
	printk("cmd is %d,arg is %ld\n",cmd,arg);
	return 0;
}

static int hello_open(struct inode *inode, struct file *file){
	printk(KERN_EMERG "hello_open");
	
	return 0;
}

static int hello_release(struct inode *inode, struct file *file){
	printk(KERN_EMERG "hello_release");
	return 0;
}

struct file_operations hello_ops = {
	.owner = THIS_MODULE,
	.open = hello_open,
	.release = hello_release,
	.unlocked_ioctl = hello_ioctl,
	
	
};



static struct miscdevice hello_dev = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = DEVICE_NAME,
	.fops = &hello_ops,
};


static int hello_init(void)
{
	printk(KERN_EMERG "hello_init enter\r\n");	
	misc_register(&hello_dev);
	return 0;
}

static void hello_exit(void)
{
	printk(KERN_EMERG "hello_exit exit!\n");
	misc_deregister(&hello_dev);
}

module_init(hello_init);
module_exit(hello_exit);

应用部分代码:

cpp 复制代码
/*************************************************************************
> File Name: Invoke.c
> Author: 
> Mail: 
> Created Time: Fri 27 Sep 2019 10:51:55 PM CST
************************************************************************/

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>

int main(void)
{
    char *fp = "/dev/hello_ctl123";
    int fd; 
    if(fd = open(fp,O_RDWR|O_NDELAY) < 0){
        printf("APP open %s  failed\r\n",fp);
       }
   else{
        printf("\r\n App open  %s success\r\n",fp);
	ioctl(fd,1,6);
    }
	close(fd);
    return 0;
}

总结:

cpp 复制代码
生成设备节点小结
-- 设备节点是"对上",为了让应用程序可以调用
生成节点的代码可以放到任何地方,和驱动注册和设备注册关系不是
那么严密,甚至没有设备注册,也是可以生成设备节点的。


生成设备节点是" "对上" ",它提供的是对上的接口。
-- 一定要注意,生成设备节点,和设备注册没有关系,而且设备节点名称
不需要和设备名称相同。
-- 一般情况下,是将设备节点注册放到probe中,但是放到init函数中的驱动
也是有的。
• Linux设备驱动一般分为:字符设备、块设备和网络设备。
-- 杂项设备多数是属于字符设备,后续我们将介绍字符设备,杂项设备可
以理解为挂载在字符设备上的设备。
-- 我个人不太习惯使用字符设备、块设备和网络设备来区分Linux设备驱动
,更加倾向于使用"XX子系统",这种分类方法在网上不是很常见。
相关推荐
阳光九叶草LXGZXJ20 分钟前
达梦数据库-学习-43-定时备份模式和删除备份(Python+Crontab)
linux·运维·开发语言·数据库·python·学习
首席拯救HMI官22 分钟前
【拯救HMI】HMI容错设计:如何减少操作失误并快速纠错?
大数据·运维·前端·javascript·网络·学习
RedKali24 分钟前
Kali Linux自定义终端美化:初级-普通中级-root高级
linux
乐观主义现代人24 分钟前
gRPC 框架面试题学习
后端·学习·rpc
zl_dfq26 分钟前
Linux 之 【文件】(重定向、一切皆文件的理解)
linux
HIT_Weston28 分钟前
99、【Ubuntu】【Hugo】搭建私人博客:搜索功能(三)
linux·运维·ubuntu
别在内卷了31 分钟前
三步搞定:双指针归并法求两个有序数组的中位数(Java 实现)
java·开发语言·学习·算法
星期五不见面31 分钟前
机器人学习!(二)ROS-模型优化与加速(TensorRT)(4)2026/01/15
学习
txinyu的博客31 分钟前
select/poll/epoll
linux·c++
小蜗的房子31 分钟前
Oracle 19c RAC重建AWR步骤详解
linux·运维·数据库·sql·oracle·操作系统·oracle rac