Linux驱动开发一

2023-05-16

一、开发模块框架

    1),编写源代码
    #include <linux/init.h>
    #include <linux/module.h>

    //加载函数
    static int __init hello_init(void)
    {
        printk("----- ^_^  --------%s-------\n",__FUNCTION__);

        return 0;
    }

    //卸载函数
    static void __exit hello_exit(void)
    {
        printk("-----------%s-----------\n",__FUNCTION__);
    }


    module_init(hello_init);//声明加载函数
    module_exit(hello_exit);//声明卸载函数
    MODULE_LICENSE("GPL");//认证
    
    2):写Makefile
      1 #指定内核源码的路径
      2 KERNEL_DIR = /home/GNNUXXL/s5pv210/kernel/linux-3.0.8
      3 CURENT_DIR = $(shell pwd)
      4
      5 all:
      6             #将当前路径下的源码编译为内核模块
      7             make -C $(KERNEL_DIR) M=$(CURENT_DIR) modules
      8 clean:
      9             #清除生成的模块文件
     10             make -C $(KERNEL_DIR) M=$(CURENT_DIR) clean
     11 install:
     12             cp *.ko /opt/rootfs/drv_module/
     13 #指定哪个文件生成模块
     14 obj-m = hello_drv.o
     
     3):将生成的模块拷贝到开发板中
        cp *.ko /opt/rootfs/drv_module/   或者使用 make install
     
     4)加载模块
     [root@GNNUXXL /drv_module]# insmod hello_drv.ko
        ----- ^_^  --------hello_init-------
    5)查看模块信息
    root@GNNUXXL /drv_module]# lsmod
            hello_drv 779 0 - Live 0x7f00c000
    6)卸载模块        
    [root@GNNUXXL /drv_module]# rmmod hello_drv
        -----------hello_exit-----------
二、模块传参特性
        1)在加载模块时,可以进行传参,但是在编写代码时要对参数进行声明
            例如:
            module_param(变量名,类型,权限 0644);
            
            module_param(num,int, 0644);
            module_param(name, charp, 0644);

            [root@GNNUXXL /drv_module]# insmod hello_arg.ko
            -------------hello_arg_init------------
            num=1001        name=bao_ma_nan
            [root@GNNUXXL /drv_module]# rmmod hello_arg
            -------------hello_arg_exit------------
            [root@GNNUXXL /drv_module]# insmod hello_arg.ko num=1999 name="fansha"
            -------------hello_arg_init------------
            num=1999        name=fansha

            
            在加载模块时会创建一个同名文件存放相关参数
            [root@GNNUXXL /drv_module]# ls -l /sys/module/hello_arg/parameters/
            total 0
            -rw-r--r--    1 0        0             4096 Jan  1 02:29 name
            -rw-r--r--    1 0        0             4096 Jan  1 02:29 num

     
        2)模块调用
        
        
            //被调用模块
            int mysum(int a,int b)
            {
                return a+b;
            }

            //声明mysum函数
            EXPORT_SYMBOL(mysum);
        
            在加载过程中,先加载被调用模块,后加载本身模块
        
            [root@GNNUXXL /drv_module]# insmod mysum.ko
            [root@GNNUXXL /drv_module]# lsmod
            mysum 561 0 - Live 0x7f010000
            [root@GNNUXXL /drv_module]# insmod hello_call.ko n=100 m=150
            -----------hello_call_init-------------
            100+150 = 250
            [root@GNNUXXL /drv_module]# lsmod
            hello_call 1000 0 - Live 0x7f014000
            mysum 561 1 hello_call, Live 0x7f010000
            
            在卸载时,先卸载本身模块,后卸载调用模块            
            [root@GNNUXXL /drv_module]# rmmod hello_call
            ------------hello_call_exit-----------
            [root@GNNUXXL /drv_module]# rmmod mysum
            
            
三、一个完成驱动程序的开发
            设备号由32位组成
                -----------> 主设备号 -------高12位
                -----------> 次设备号 -------低20位
        
        1)申请设备号:
        register_chrdev(unsigned int major, const char * name, const struct file_operations * fops)
        参数1:
            当major=0时,主设备号为动态分配,函数返回主设备号
            当major>0时,主设备号为静态分配,成功函数返回0
        参数2:驱动的描述信息---->自定义
        参数3:操作方法
        
        查看设备号 cat /proc/devices
        [root@GNNUXXL /drv_module]# cat /proc/devices
        Character devices:
          1 mem
        256 hello_drv
          2 pty
          3 ttyp
          4 /dev/vc/0
          4 tty
          4 ttyS
          5 /dev/tty
          5 /dev/console
          5 /dev/ptmx
          7 vcs
         10 misc
         13 input
         21 sg
        128 ptm
        136 pts
        204 ttySAC

        
        2)创建设备节点
            ----->手动创建设备节点
                mknod 设备名 设备类型  主设备号  次设备号
                mknod /dev/hello c 254 0 
        
        
            ----->自动创建设备节点
                创建类                
                class_create(owner, name)
    
                
                创建设备
                register_device(char * name, unsigned long start, unsigned long len)
        
        3)实现操作方法
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux驱动开发一 的相关文章

  • Laravel 5.4.* - 运行 artisan 时“”目录不存在

    我有一个全新安装的Ubuntu服务器14 04我目前正在尝试安装我的Laravel项目上 我已将整个存储库移至所需的文件夹中 但是当我运行命令时 php artisan 在该目录中 终端返回一个错误 指出 InvalidArgumentEx
  • 在 64 位 RHEL 上安装 32 位库 (glibc),而不使用 yum

    我试图让 32 位应用程序在 64 位 RHEL 6 1 上运行 但该计算机无法访问互联网 有没有办法在 64 位 RHEL 上安装 32 位 glibc 而不使用 yum 即仅使用 RPM 安装 我从 RHEL 6 1 ISO 中获取了
  • Linux 内核中的 64 位 time_t

    我已经编译了内核 3 19 1 但仍然有问题time t 只是一个简单的程序cout lt lt sizeof time t 给出 4 个字节的大小 而不是我的意图的 8 个字节 我应该在 make menuconfig 期间打开特定选项吗
  • Linux - 查找特定文件之后和之前的文件

    我试图在我的计算机上查找特定文件创建前 1 小时和创建后 1 小时创建的文件 这是我尝试过的方法 find root newermt 2012 10 04 1800 and newermt 2012 10 04 2000 exec ls l
  • 从哪个 Linux 内核/libc 版本开始,Java Runtime.exec() 在内存方面是安全的?

    在工作中 我们的目标平台之一是运行 Linux 的资源受限的迷你服务器 内核 2 6 13 基于旧 Fedora Core 的自定义发行版 该应用程序是用 Java Sun JDK 1 6 04 编写的 Linux OOM Killer 配
  • Symfony 权限被拒绝

    谁能帮我解决我收到的以下错误消息 我终于在虚拟机上安装了 Symfony 它似乎工作正常 除了我偶尔收到这样的消息 1 2 ContextErrorException Warning SessionHandler read open var
  • Capistrano RVM 和 Ubuntu RVM 不是一个函数,使用“rvm use ...”选择 rubies 将不起作用

    我第一次尝试在 ubuntu 服务器上部署我的应用程序 我一直遇到这个错误 2013 03 24 15 13 36 executing deploy run migrations executing rvm gemset use vapin
  • 为什么 gcc 会在显然不需要的时候生成 PLT?

    考虑这段代码 int foo int main foo while 1 int foo 在共享对象中实现 编译此代码gcc o main main c lfoo nostdlib m32 O2 e main no pic L shared给
  • 为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

    例如 此行失败 nohup for i in mydir fasta do myscript sh i done gt output txt bash syntax error near unexpected token do 正确的做法是
  • WSL gprof 报告零次

    我正在尝试在 Windows 10 上的 WSL 中使用 gprof 我没有预料到会遇到任何困难 因为上次我在 Windows 7 上的 Ubuntu 虚拟盒中使用它时它工作得很好 与以前一样遵循来自https www thegeekstu
  • 如果等于特定值则替换列

    我希望替换 CSV 中的第四列 如果它等于 N A 我正在尝试将其更改为 1 我似乎无法让它发挥作用 awk F if 4 N A 4 1 test csv 您可以使用以下内容awk awk F 4 4 N A 1 4 1 OFS test
  • posix 和 linux 特定函数的 C++ 包装器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道有什么好的库将 posix 和 linux 函数和结构 例如套接字或文件描述符 包装到 C 类中
  • 如何重新安装cudnn?

    安装Cudnn 4 0 4后 我发现如果我想运行我下载的代码 我需要更高版本的Cudnn 然后我下载 cudnn 7 0 linux x64 v4 0 prod tgz 并直接按以下顺序安装 sudo cp include cudnn h
  • 移动除一个文件之外的所有文件

    如何移动除一个文件之外的所有文件 我正在寻找类似的东西 mv Linux Old Tux png Linux New 我将旧的东西移动到新的东西文件夹中 除了Tux png 符号代表否定 有一些工具可以完成这项工作吗 如果您使用 bash
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • c - 后台运行的程序的退出状态

    我有一个任务 其中我必须创建一个迷你 shell 它能够执行很多操作 包括作业控制 我设法使用 fork 和 execvp 创建新的工作 但我还想获取 execvp 运行的程序的退出代码 根据我从其他帖子中查找到的内容 我可以使用以下方法来
  • 使用vim,如何快速刷新正在处理的网页?

    我已经使用 VIM 几个星期了 同时处理各种网络语言 我真的很喜欢它 我发现必须点击或单击浏览器并刷新页面才能看到代码更改的效果 这很麻烦 更烦人的是 因为我使用的是 Virtual Box 而且我倾向于在主机系统上处理 PDF 文件 因此
  • 如何在多行而不是单行输出上打印 Linux 组名称

    我尝试过 getent group 命令 id Gn user 和一些 sed 组合 但我认为我无法实现 因此向其他程序员伸出援手 我希望能够打印此 groups abc123输出 abc123 devops 构建测试设计 预期输出 gro
  • 检测目录中是否有某些内容被修改,如果是,则备份 - 否则不执行任何操作

    我有一个 数据 目录 我通过 shell 脚本定期同步到远程 NAS 但是 我想让这变得更有效率 我想在运行 rsync 之前检测 数据 中是否发生了变化 这样我就不会不必要地唤醒 NAS 上的驱动器 我正在考虑修改 shell 脚本以获取
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上

随机推荐

  • 内置googletts并且内置中文语音包

    先上补丁 diff git a frameworks base core java android speech tts TextToSpeech java b frameworks base core java android speec
  • rk3128 7.1修复插入键盘后软键盘仍然弹出的bug

    有客户反馈说 xff0c 3128插入物理键盘后 xff0c 输入时软键盘仍然弹出来 测试测了一下果然是这样 xff0c 一开始还以为前任码农改出来的问题 xff0c 试了一下最新sdk xff0c 仍然如此 卧槽 然后上网搜 xff0c
  • RK3128 7.1新SDK开otg

    dts xff1a usb0 usb 64 10180000 0 Normal 1 Force Host 2 Force Device rockchip usb mode 61 lt 2 gt 这个是重点 device mk PRODUCT
  • 给logcat添加额外的输出

    打logcat的时候 xff0c 通常是需要排bug的时候 我们希望知道这是什么固件 xff0c 系统已运行多久当前的内存情况等信息 可以这么改 system core logcat logcat cpp void dumpSysInfo
  • Chromium源码获取与编译--附加一个简单例子的编译

    从工作到现在 xff0c 一直弄界面相关的东西 xff0c 弄了好多年 xff0c 包括前公司也买了一套UI xff0c 但是用下来以后发现不是这个问题就是那个问题 现在新的公司还在用MFC MFC其实没什么不好 xff0c 就是不能改源码
  • windows下使用cmake编译zlib与libpng 留此备份

    首先准备工具 cmake http www cmake org cmake resources software html zlib http www zlib net libpng http www libpng org pub png
  • opengl下png图片的加载与显示

    首先说明 部分代码来自http www cnblogs com IamEasy Man archive 2009 12 14 1624023 html 至于里面的源地址什么的我不管 然后吐槽 xff0c 国内的资料各种坑爹 xff0c 竟没
  • opengl透明mask图片做蒙版效果的实现

    hello xff0c 朋友们 xff0c 我又来了 xff0c 还记得上篇文章提到的事情否 xff1f 没错 xff0c 加载png只是第一步 xff0c 接下来要实现用mask图扣掉png中不需要的部分 xff08 也就是cocos2d
  • Unity3d 5.3.5使用sqlite3

    国内讲的乱七八糟 xff0c 更有故作神秘提供Mono Data Sqlite dll System Data dll的 xff0c 就是不告诉你这两文件在哪里 我很无语 看国外的 xff0c 多靠谱 http answers unity3
  • Zabbix 监控主机是否在线

    最近有点忙 xff0c 很久没有更新博客了 今天这篇文章主要记录如何通过zabbix监控一台主机是否在线 好啦开干 1 新建一个模板 新建模板的目的是在新模板上添加 监控项 和 触发器 的 xff0c 如果你要监控的主机数量非常少的话 xf
  • VSCODE 使用SSH远程连接(Windows10)

    开启Windows10的SSH功能 点击开始菜单 gt 设置 gt 应用 gt 应用和功能 gt 可选功能 gt 添加功能 xff1b 添加OpenSSH 客户端 和 OpenSSH 服务器 然后cmd 输入ssh xff0c 一般会出现下
  • Jetson NX emmc版本系统转移到SSD

    因emmc版本的NX自带内存不够大 xff0c 只有16GB xff08 手上的是这个型号 xff09 xff0c 安装系统大概需要除去4G多内存 xff0c 再安装CUDA cuDNN TensorRT等内存直接爆满 无法继续使用 所以需
  • unix 修改文件类型

    Unix及类Unix系统里 xff0c 每行结尾只有换行 n xff1b Windows系统里面 xff0c 每行结尾是换行 43 回车 n r 第一种 xff1a 利用Linux下的vim编辑器 xff0c 可以方便的在dos文件 uni
  • DIR=$(cd `dirname $0`; pwd)

    dirname 0 xff0c 获取当前脚本所在绝对目录 cd 96 dirname 0 96 xff0c 进入这个目录 xff08 切换当前工作目录 xff09 pwd xff0c 显示切换后脚本所在的工作目录 echo xff0c 打印
  • ulimit命令的使用

    ulimint a 用来显示当前的各种用户进程限制 Linux对于每个用户 xff0c 系统限制其最大进程数 xff0c 为提高性能 xff0c 可以根据设备资源情况 xff0c 设置个Linux用户的最大进程数 xff0c 一些需要设置为
  • error while loading shared libraries: libavformat.so.58: cannot open shared object file: 解决

    sutpc icvtsn dfa error while loading shared libraries libavformat so 58 cannot open shared object file No such file or d
  • Git 检测不到文件目录下的文件变化信息

    Git在上传代码的时候发现有的只能检测出某个目录 xff0c 然而检测不到那个目录下的C文件和h文件 并且git 提交之后 xff0c 在git上某个文件有后缀 64 b4c4u7之类的 这种文件没办法点击 没办法查看 xff0c 根本无法
  • Linux 搭建MQTT服务器并使用

    环境 xff1a ubuntu 18 04 1 安装必备软件 span style background color f6f6f6 span style color 121212 yum install gcc c 43 43 cmake
  • 批量ping多个IP地址

    for L D in 90 1 95 do ping 10 10 70 D gt gt ping log 代码的意思如下 xff1a 代码中的这个 90 1 95 就是网段起与始 xff0c 就是检测网段10 10 70 90到10 10
  • Linux驱动开发一

    一 开发模块框架 1 xff09 编写源代码 include lt linux init h gt include lt linux module h gt 加载函数 static int init hello init void prin