树莓派linux驱动学习之hello world

2023-05-16

http://blog.csdn.net/hcx25909/article/details/16860055

最近想学习一下linux驱动,看了一些书和教学视频,大概了解了一下,不过要想深入,肯定需要实践。手上有几块linux的板子,最终选择了树莓派作为我的实验平台,资料比较丰富,接口也比较简单。

        程序员的入门经典当然就是hello world程序了,我的第一个实验就是要搭建实验环境和工具链,通过交叉编译的方式,在上位机完成hello world驱动程序的编写,最终在板子上运行。

一、安装树莓派系统

        首先要在树莓派上安装系统,这个网上的资料比较多,就不细说了,我使用的是2013-09-25-wheezy-raspbian,下载地址可见:http://www.raspberrypi.org/downloads
          最终搭建的平台如下,后期的通讯可以直接使用串口,就不需要HDMI输出了: 
        

二、下载交叉编译工具链

        交叉编译工具链可以帮助我们在PC机上完成驱动程序的开发,此外还需要和下位机配套的Linux内核代码,树莓派官方已经为我们提供了相应的内核代码和工具链,直接使用git下载:

<span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent;"></span><pre class="bash" name="code" style="white-space: pre-wrap; word-wrap: break-word;">    $ <span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; color: rgb(194, 12, 185);">git clone</span><span style="background-color: transparent;"> git:</span><span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent;">//</span><span style="background-color: transparent;">github.com</span><span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent;">/</span><span style="background-color: transparent;">raspberrypi</span><span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent;">/</span><span style="background-color: transparent;">linux.git RpiLinux</span>  

<span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"></span><pre class="bash" name="code" style="white-space: pre-wrap; word-wrap: break-word;">    $ <span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; color: rgb(194, 12, 185);">git clone</span><span style="background-color: transparent;"> git:</span><span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent;">//</span><span style="background-color: transparent;">github.com</span><span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent;">/</span><span style="background-color: transparent;">raspberrypi</span><span style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent;">/</span><span style="background-color: transparent;">tools.git RpiTools</span>  

需要注意的是下载的时候要注意内核代码是否和我们板子中的内核版本相同,我使用的是3.6.11+,所以下载代码的时候也要选择3.6.y这个版本。

三、编写驱动代码

我们在上位机编写hello world的代码:
[cpp] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <linux/init.h>  
  2. #include <linux/module.h>  
  3. #include <linux/moduleparam.h>  
  4.   
  5. MODULE_LICENSE("Dual BSD/GPL");  
  6.   
  7. static int hello_init(void)  
  8. {  
  9.     printk(KERN_ALERT"Hello, world\n");  
  10.     return 0;  
  11. }  
  12.   
  13. static void hello_exit(void)  
  14. {  
  15.     printk(KERN_ALERT"Goodbye, cruel world\n");  
  16. }  
  17.   
  18. module_init(hello_init);  
  19. module_exit(hello_exit);  
相应的makefile代码:
[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ifneq ($(KERNELRELEASE),)  
  2.   
  3. obj-m := hello.o  
  4.   
  5. else  
  6.       
  7. KDIR := /home/hcx/work/boards/RPi/kernel/linux-rpi-3.6.y  
  8. all:  
  9.     make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=/home/hcx/work/boards/RPi/kernel/RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-  
  10.   
  11. clean:  
  12.     rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*  
  13.   
  14. endif  

编译完成后,我们通过U盘将hello.ko文件拷贝到树莓派中,然后通过insmod插入模块,结果如下:

----------------------------------------------------------------

欢迎大家转载我的文章。

转载请注明:转自古-月

http://blog.csdn.net/hcx25909

欢迎继续关注我的博客


  

  

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

树莓派linux驱动学习之hello world 的相关文章

  • 我们如何在使用循环时调用 ansible playbook 中的变量

    我有两个文件 其中这些文件包含server names and server IP s 我想更改 替换一些特定的server names and IP addressees根据要求在两个文件中 这与这篇文章 因为它被要求开设一个新职位 ht
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 在 Linux 中重新启动时,新创建的文件变为 0 kb(数据被覆盖为空)

    我遇到了一个奇怪的问题 这让我发疯 当前的任务是在 root 用户第一次登录时启动一组文件 并在同一用户第二次登录时启动另一组文件 我决定使用 profile 和 bashrc 文件 并在第一次登录期间发生的任务结束时重新加载 bashrc
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe

随机推荐

  • Visual Studio 2019 重新生成 OpenCV 解决方案报 LNK2019 无法解析的外部符号 __imp__Py_NegativeRefcount、__imp_Py_RefTotal

    Visual Studio 2019 重新生成 OpenCV 解决方案报 LNK2019 无法解析的外部符号 imp Py NegativeRefcount imp Py RefTotal 错误问题详情解决方法修改 96 pyconfig
  • C++代码升级C++11编译报错常见问题及解决

    近日代码编译升级C 43 43 11 xff0c 编译中遇到的一些warning问题解决 xff0c 且在C 43 43 11之前的编译版本代码没有任何报错 xff08 ERROR xff09 和警告 xff08 WARNING xff09
  • 我的人生之第二次转折点

    之前一直想自己写一个日记本的 xff0c 但是由于最近事情比较多 xff0c 就搁浅了 xff0c 其实最主要的原因是自己的技术水平还是有所欠缺 xff0c 没有到达类似与我当初跳舞的水平 xff0c 那种炉火纯青 xff0c 那种如鱼得水
  • 二、Docker安装、启动、卸载、示例

    Docker 支持 CentOS 6 及以后的版本 xff0c 可以直接通过yum进行安装 xff1a 使用流程 xff1a 启动主机 启动Docker服务 下载容器镜像 启动镜像得一个到容器 进入容器使用我们想要的程序 主机一般是Linu
  • word设置页眉页码 首页没有页眉(终于搞懂了)

    1 设置首页没有页眉 主要是通过分节符完成的 xff0c 顾名思义 xff0c 分节符就是将全文分为两节 xff0c 然后就可以实现对两节内容的分别设置 比如首页没有页眉 在首页的最后一行插入分节符 xff0c 然后就会显示出 xff08
  • 一步步使用Tomcat+CAS完成单点登录

    1 最基本的单点登录 客户端配置 xff1a 1 Tomcat配置SSL 1 生成证书 打开cmd或终端 xff0c 命令行切换到Tomcat所在目录 xff0c 执行如下命令 xff1a D JayHe Environment tomca
  • 人脸识别读书笔记

    浅析人脸检测之 Haar 分类器方法 一 Haar 分类器的前世今生 目前的人脸检测方法主要有两大类 xff1a 基于知识和基于统计 基于知识的方法主要利用先验知识将人脸看作器官特征的组合 xff0c 根据眼睛 眉毛 嘴巴 鼻子等器官的特征
  • make编译时的常见错误

    make编译时的常见错误 未定义的引用1 xff1a 缺少头文件未定义的引用2 xff1a 没找这个系统头文件未定义的引用3 xff1a 链接库没包括进来静态库动态库 必须承认的是 xff0c 写代码最痛苦的不是算法 xff0c 而是环境的
  • 深度学习中的常见名词(baseline,benchmark,etc)

    本文主要用于解释一些在深度学习中常见的名词 xff0c 重点参考了博客 xff1a https towardsdatascience com generalization regularization overfitting bias an
  • Ubuntu安装docker-ce

    docker在大型项目上使用范围很广 xff0c 为了在Ubuntu自测docker xff0c 心血来潮 xff0c 准备自己搭建docker进行测试 因为使用apt直接安装docker的版本比较低 xff0c 在此按照官网的教程安装do
  • 【stm32】UART串口中断方式收发任意长度数据(HAL库开发,中断中不使用库函数 使用寄存器和自定义存储函数)

    一 起因 为什么要写一个串口接收不定长数据 xff0c 还要把数据保存起来 xff1f xff1f 因为存起来的数据要用要判断要根据数据做不同的处理 xff0c 要把数据拿到后解析 但是 xff0c 最开始想当然的使用HAL库中的HAL U
  • 腾讯云轻量应用服务器安装和配置宝塔 Linux 面板腾讯云专享版

    宝塔 Linux 面板腾讯云专享版由腾讯云与堡塔公司联合开发 xff0c 专享版在已支持普通版所有功能的基础上 xff0c 还默认集成腾讯云对象存储 文件存储 内容分发网络和 DNS 解析插件 插件具备如下功能 xff1a 支持将对象存储的
  • Ubuntu操作系统如何搭建可视化界面?

    VNC xff08 Virtual Network Console xff09 是虚拟网络控制台的缩写 它是一款优秀的远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发 VNC 是基于 UNIX 和 Linux
  • ubuntu密码忘记-解决方法

    1 xff1a 开机按Shift键 xff0c 出现如下界面 xff08 手速要快 xff0c Shift键要按时间久一点 xff09 选择第二项 2 xff1a 按回车键进入如下界面 xff0c 然后选中有recovery mode的选项
  • git 仓库迁移,保留提交记录,同时提交到多个仓库

    git 仓库迁移 xff0c 保留提交记录 xff0c 同时提交到多个仓库 1 仓库迁移并保留原有的提交记录 应用场景 原有需求在 A 存储库地址进行开发 xff0c 现在新建了一个 B 存储库 xff0c 要求将 A 的代码和提交记录一起
  • STM32MP157开发-STM32CubeProgrammer-No DFU detected解决

    STM32MP157开发 STM32CubeProgrammer No DFU detected解决 xff0c 在开发时 xff0c 需要用STM32CubeProgrammer烧录固件 xff0c 但是按照官方文档 xff0c 安装后
  • Python正则表达式学习(5)——re.findall()

    re findall xff08 pattern xff0c string xff0c flags 61 0 xff09 返回字符串中模式的所有非重叠匹配 xff0c 作为字符串列表 字符串从左到右扫描 xff0c 并按照找到的顺序返回匹配
  • linux内核插入模块时 Unknown symbol in module

    编译驱动的时候碰到了 insmod error inserting 39 igb ko 39 1 Unknown symbol in module 的问题 xff0c 在网上看了下 xff0c 说是查看 dmesg tail 看输出信息中的
  • Linux路由器

    宽带上网已经不是什么新鲜事情 xff0c 人们对相关的网络器件已经不再陌生 xff0c 比如说常见的路由器 对于一般的网络用户 xff0c 他们能知道怎样使用路由器来上网 玩游戏等就已经感到很满足了 xff0c 通常情况下对路由器的深层技术
  • 树莓派linux驱动学习之hello world

    http blog csdn net hcx25909 article details 16860055 最近想学习一下linux驱动 xff0c 看了一些书和教学视频 xff0c 大概了解了一下 xff0c 不过要想深入 xff0c 肯定