linux c 编程 ------ 通过设备节点调用驱动

 

 驱动程序如下,加载驱动后,会在/dev文件夹下生成一个文件hello_device_node,是此驱动的设备节点

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

#define DRIVER_NAME "hello"
#define NODE_NAME "hello_device_node"

MODULE_LICENSE("Dual BSD/GPL"); // required
MODULE_AUTHOR("liuShuiDeng");


static long hello_fs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    printk("\ncmd is %d, arg is %ld\n", cmd, arg);
    return 0;
}
static int hello_fs_release(struct inode *inode, struct file *file)
{
    printk(KERN_EMERG "\nhello_fs_release\n");
    return 0;
}
static int hello_fs_open(struct inode *inode, struct file *file)
{
    printk(KERN_EMERG "\nhello_fs_open\n");
    return 0;
}
static struct file_operations hello_fops = {
    .owner = THIS_MODULE,
    .open = hello_fs_open,
    .release = hello_fs_release,
    .unlocked_ioctl = hello_fs_ioctl,
};
static struct miscdevice hello_miscdevice = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = NODE_NAME,
    .fops = &hello_fops,
};
static int hello_probe(struct platform_device *p)
{
    printk(KERN_EMERG "\nhello_probe\n");
    misc_register(&hello_miscdevice);
    return 0;
}

static int hello_remove(struct platform_device *p)
{
    printk(KERN_EMERG "\nhello_remove\n");
    misc_deregister(&hello_miscdevice);
    return 0;
}

static void hello_shutdown(struct platform_device *p)
{
    printk(KERN_EMERG "\nhello_shutdown\n");
}

static int hello_suspend(struct platform_device *p, pm_message_t state)
{
    printk(KERN_EMERG "\nhello_suspend\n");
    
    return 0;
}

static int hello_resume(struct platform_device *p)
{
    printk(KERN_EMERG "\nhello_resume\n");
    
    return 0;
}

static struct platform_driver hello_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) //insmod xxx.ko, execute it
{
    printk(KERN_EMERG "\nhello world enter~\n\n");
    platform_driver_register(&hello_driver);
    return 0;    
}

static void hello_exit(void) //rmmod xxx( note: not xxx.ko ), execute it
{
    printk(KERN_EMERG "\nhello world exit~\n\n");
    platform_driver_unregister(&hello_driver);
}



module_init(hello_init);
module_exit(hello_exit);
复制代码

 

 

应用程序如下

编译驱动程序的编译器和编译应用程序的编译器建议用同一个

编译应用程序指令:arm-none-linux-gnueabi-gcc -o invoke_hello invoke_hello.c

修改权限指令:chmod 777 invoke_hello

复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>


void main()
{
    int fd;
    char *hello_node = "/dev/hello_device_node";

    fd = open(hello_node, O_RDWR|O_NDELAY);
    if(fd < 0)
    {
        printf("APP---->can't open \"%s\"\n",hello_node);
    }else
    {
        printf("APP--->open \"%s\" successfully\n", hello_node);
        ioctl(fd,1,2);
    }

    close(fd);
}
复制代码

 

posted @   流水灯  阅读(2061)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示