码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一个linux最简otg驱动源代码


    /*

    加载内核模块:sudo insmod otg.ko

    卸载内核模块:sudo rmmod otg

    列举内核模块: lsmod | grep otg 查看信息;如下图所示。

    编译:

    make -C /lib/modules/4.19.161-kernel/build M=/home/appninja/driver modules

    Makefile中:

    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules

    */

    #include <linux/module.h>

    #include <linux/fs.h>

    #include <linux/proc_fs.h>

    #include <linux/version.h>

    #include <linux/kernel.h>

    #include <linux/init.h>

    static struct proc_dir_entry *proc_otg_entry = NULL;

    static ssize_t proc_otg_read(struct file *filp, char __user *buf, size_t count, loff_t *offp)

    {

        int n = 0, ret;

        char secrets[100];

        sprintf(secrets, "kernel secrets %s\n", filp->f_path.dentry->d_iname);

        n = strlen(secrets);

        if(*offp < n)

        {

            *offp = n+1;

            ret = n+1;

        }

        else

            ret = 0;

        return ret;

    }

    static ssize_t proc_otg_write(struct file *file, const char __user *buffer,

        size_t count, loff_t *data)

    {

        char cmd[100] = { 0x00 };

        int i = 0;

        if (count < 1)

        {

            printk("count <=1\n");

            return -1;

        }

        if (count > sizeof(cmd))

        {

            printk("count > sizeof(cmd)\n");

            return -2;

        }

        return i;

    }

    #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)

    static const struct proc_ops proc_otg_fops = {

     .proc_read = proc_otg_read,

     .proc_write = proc_otg_write,

    };

    #else

    static const struct file_operations proc_otg_fops = {

     .owner = THIS_MODULE,

     .read  = proc_otg_read,

     .write = proc_otg_write,

    };

    #endif

    static int __init otg_init(void)

    {

        proc_otg_entry = proc_create("otg_usb", 0, NULL, &proc_otg_fops);

        return 0;

    }

    static void __exit otg_exit(void)

    {

        if(proc_otg_entry)

            proc_remove(proc_otg_entry);

    }

    module_init(otg_init);

    module_exit(otg_exit);

    MODULE_LICENSE("GPL");

  • 相关阅读:
    力扣459-重复的字符串——字符串匹配KMP算法
    RocketMQ —消费进度管理
    代码随想录算法训练营第三十九天 |● 62.不同路径 ● 63. 不同路径 II
    分享几招教会你怎么给图片加边框
    SVN安装教程
    上半年业绩韧性增强,两大核心业务成第二增长点,商汤用硬科技冲刺AI长跑
    3D虚拟情景实训系统在英语课堂教学中的应用
    Spring源码之七registerListeners()及发布订阅模式
    学习pytorch6 torchvision中的数据集使用
    《动手学深度学习 Pytorch版》 8.4 循环神经网络
  • 原文地址:https://blog.csdn.net/a2831942318/article/details/125483590
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号