树莓派做linux底层驱动,树莓派-底层开发(1)-linux驱动hello world

最近想鼓捣一下Linux,手头刚买一块树莓派3B+,笔者以前只干过单片机,我想是否可以像单片机那样,从读写寄存器这个角度进行学习理解。首先希望实现硬件的驱动编写,网上这方面资料杂并且久,水平较低折腾了一天,终于写了一个可以跑的驱动模块,整理在这里,备忘并供需要的朋友参考。

开发环境

PC:ubuntu 64位 ssh接入显示信息如下

Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-46-generic x86_64)

树莓派 32位官方镜像 ssh接入显示信息如下

Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l

查看系统版本指令uname -a 查看系统是多少位的getconf LONG_BIT

基本思路

在pc端编写驱动模块代码,并搭建交叉编译环境。编译驱动模块并放到树莓派中运行。

操作过程

1)pc端:编写驱动模块代码vi hello.c,命名为hello.c,代码如下

注意这个地方一定要有.c 习惯windows的默认隐藏后缀容易忽略

#include #include #include MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)

{

printk(KERN_ALERT"Hello, world\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT"Goodbye, cruel world\n");

}

module_init(hello_init);

module_exit(hello_exit);

2)pc端:编写Makefilevi Makefile(大写M)

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

else

PWD :=$(shell pwd)

KDIR := /home/ysl/work/rastools/linux-rpi-4.14.y

all:

make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul*

endif

3)pc端:这两文件放在同一目录下,写好代码之后就可以编译了,安装make工具apt-get install(此处具体指令是啥没有纪录下来),然后终端进入该目录下,输入指令make。。。肯定是不行的,为啥?1没有编译器GCC 2,没有驱动需要的linux库,这些库我理解在树莓派的kernel中。3你下载的路径和我的不一定一样。那么就需要下载这两个东西,树莓派已经完完整整的放在Github上面。到这个地方就能理解为啥叫交叉编译环境,用的工具和库都和PC环境不一样。

4)树莓派端:查看kernel的版本,使用指令uname -a

5)PC端:下载树莓派kernel对应版本的linux kernel,版本号一定要对应,最新已经是4.19了

https://github.com/raspberrypi/linux/tree/rpi-4.14.y

7f0156b26d09ff270a981d31bf7b6dec.png

可以使用git工具,但是下面的地址要根据自己的版本情况调节

git clone git://github.com/raspberrypi/linux.git RpiLinux

6)PC端:下载树莓派官方提供的交叉编译工具Tools,这个地方没有涉及到版本问题

https://github.com/raspberrypi/tools

git clone git://github.com/raspberrypi/tools.git RpiTools

7)PC端:解压之后笔者的kernel在linux-rpi-4.14.y 目录 编译器等工具在RpiTools目录4c3d7ec6e15c08f90c0ad3cbc4f1cf31.png

8)PC端:把交叉编译工具路径加入到环境变量

sudo vi ~/.bashrc

在文件末尾加入:

export PATH=$PATH:$HOME/work/rastools/RpiTools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

要点:a根据自己下载的路径来调整。b因为我的是64位,所以选择/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin,测试和树莓派多少位并没有关系,选32位的无法编译(32位可以选择/gcc-linaro-arm-linux-gnueabihf-raspbian,但我没有在32位ubuntu上测试过)

更新:source ~/.bashrc

测试是否加入arm-linux-gnueabihf-gcc -v

查看指令的路径which arm-linux-gnueabihf-gcc

9)PC端:首先进入linux-rpi-4.14.y 目录 下编译树莓派kernel

此处可以参考:https://blog.csdn.net/u010833052/article/details/78481973,

笔者粗略描述一下过程,首先树莓派端通过sudo modprobe configs指令,会在/proc/目录下生成config.gz文件,将其复制到PC端下载好的树莓派kernel目录下面,执行指令zcat config.gz > .config

依次执行KERNEL=kernel7

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs 可以加入-jn加快编译速度,我这台**-j8**实验成功

10)PC端:进入第一步编写好的hello.c目录,修改您自己的Makefile文件~主要修改kernel路径

11)PC端:执行 make指令 有的资料显示会出错,需要安装32位运行环境,但我的64位系统似乎没有影响,

sudo apt-get install lib32z1 lib32ncurses5

sudo apt-get install lib32stdc++6

12)复制pc端编译好的hello.ko 到树莓派

13)树莓派端:进入刚才的ko文件目录,执行指令sudo insmod hello.ko

14)树莓派端:执行指令dmesg,可以看到打印信息

0f98da16321b31634dc9e5c9679441b7.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值