Arm开发板(什么是arm开发板)
打开盒子,里面有一张全家福。
盒子里的东西包括一个开发板(背板+核心板)、一个12V2A电源适配器、一根micro usb安卓数据线、一根type-c安装数据线和一根显示线。
再给我一张发展委员会的特写。
这款开发板有两个版本,一个是内存容量为512MB+512MB的NAND版本,另一个是内存为512MB+8GB的eMMC版本。我手里有NAND版本。NAND和eMMC开发的程序除了U-boot外都是一样的,很容易切换。野火i.MX6ULL处理器的时钟频率为800MHz,包含两个网络端口,因此很容易对网络进行编程。
开发板的配置如上图所示。板载一个HDMI高清视频接口,没有屏幕的时候可以直接连接电脑屏幕。关于拆包的内容,就这些。
NFS的环境建设
本文将ubuntu18.04安装在win10的虚拟机中进行开发,所有的坑和解决方案都是基于这个系统。进入ubuntu的终端
sudo apt-get updatesudo apt install net-toolssudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop将ubuntu和开发板连接到同一个路由器,确保它们的ip在同一个网段。进入Ubuntu
sudo apt install nfs-kernel-server在“个人/用户”下设置nfs文件夹,并通过以下命令授予权限(我的用户目录是hasee)
sudo chmod -R 777 nfs使用vim命令打开/etc/export以更改以下内容
保存后重新启动虚拟机。使用ifconfig查询ubuntu下的原生ip
我的IP: 192.168.2.217通过串口终端连接win10电脑和开发板,分享一个我经常使用的工具mobxterm _ personal _ 20.6,功能非常强大,谁都知道。打开MobaXterm,如下图操作。
这样就可以操作开发板的终端了。首先,在根目录下的mnt目录中设置nfs文件夹,输入pwd并返回以下路径
进入开发板
sudo mount -t nfs 192.168.2.217:/home/user/nfs /mnt/nfs说明:192.168.2.217这个IP是计算机虚拟机ubuntu的ip/home/user/nfs是虚拟机ubuntu的nfs文件夹路径/mnt/nfs是开发板中nfs的路径,只要不出现以下提示就表示成功:
编写第一个测试程序
用ubuntu编写一个简单的测试程序,文件名为helloworld.c,源代码如下
#include "stdio.h"int main(int argc,char **argv){ printf("hello world!\n"); return 0;}执行以下命令进行编译。这里必须使用交叉编译工具,否则无法在开发板上运行:
gcc-arm-linux-gnueabihf-gcc helloworld.c -o helloworldhelloworld文件将在相同的路径中生成,如下所示
通过cp命令将新生成的helloworld文件复制到ubuntu的home/user/nfs路径。从win10上的MobaXterm工具操作开发板终端,输入/mnt/nfs路径,找到里面的helloworld文件,执行命令。
./helloworld这意味着程序成功执行,构建的环境可用。前面我们已经实现了最简单的驱动模板,这次我们将继续探索驱动的编写。驱动代码核心的两个句子是注册模块加载函数module_init()和注册模块卸载函数module_exit()。这次我们要提的是设备号的应用,角色设备的注册,节点的创建。
应用设备号
申请设备号通常有两种方式:静态申请和动态申请。
静态应用设备号
静态应用设备号的功能原型
int register_chrdev_region(dev_t from, unsigned count, const char *name)//参数dev_t from: dev_t类型的变量,用于指定字符设备的起始设备号,如果要注册的设备号已经被其他的设备注册了,那么就会导致注册失败。//参数unsigned count:指定要申请的设备号个数,count的值不可以太大,否则会与下一个主设备号重叠。//参数const char *name:表示设备名称,我们可以在/proc/devices中看到该设备。//返回值0表示申请成功,返回其它表示失败,并且失败的原因可以通过错误码获取。使用静态应用程序设备号时,您需要检查内核中使用了哪些设备号。一旦出现重复,申请设备号就会失败,相应的设备注册也不会成功,使用起来非常不方便。
动态应用设备号
动态应用设备号的功能原型
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)//参数dev_t *dev:指向dev_t类型数据的指针变量,用于存放分配到的设备编号的起始值;//参数unsigned baseminor:次设备号的起始值,通常情况下,设置为0;//参数unsigned count:同register_chrdev_region类型,用于指定需要分配的设备编号的个数以及设备的名称。//返回值0表示申请成功,返回其它表示失败,并且失败的原因可以通过错误码获取。这个功能,内核会自动给我们分配一个不用的主设备号。不要以为操作使用比静态方便多了。这在驱动程序开发中非常常见,尤其是在3的内核中。X.
发布设备号
无论哪种方式,您都需要使用unregister_chrdev_region()函数来释放设备号。删除设备时调用释放设备号的功能,以便在设备重新注册时提供可用的设备号。如果删除时没有释放,再次添加设备时会报错,导致新设备不可用,从而影响驱动的稳定性。功能原型
void unregister_chrdev_region(dev_t from, unsigned count)//参数dev_t from:指定需要注销的字符设备的设备编号起始值,我们一般将定义的dev_t变量作为实参。//参数unsigned count:指定需要注销的字符设备编号的个数,该值应与申请函数的count值相等,通常采用宏定义进行管理。动态综合模式的应用设备数量
内核中提供了一个函数,可以用于动态应用程序和静态应用程序。原型如下
static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops){ return __register_chrdev(major, 0, 256, name, fops);}//参数unsigned int major:该参数用于指定要申请的主设备号,相当于静态申请,当该值设为0时,由系统自动分配,相当于动态申请。//参数const char *name:指定设备的名称。//参数const struct file_operations *fops:设备的函数接口指针。该功能的释放装置号功能的原型如下
该函数的释放设备号函数原型如下static inline void unregister_chrdev(unsigned int major, const char *name){ __unregister_chrdev(major, 0, 256, name);}至于这部分,贴出我的代码。
printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Init\n");ret = alloc_chrdev_region(&devno, 0,1, "HelloWorld");if(ret == 0) printk(KERN_EMERG "[ KERN_EMERG ] baseminor ok\n");else return 0;major = MAJOR(devno);minor = MINOR(devno);Cdev操作
初始化
我们使用驱动API与系统API进行关联,主要是实现file_operations结构,需要通过cdev_init()函数进行操作。
void cdev_init(struct cdev *cdev, const struct file_operations *fops)//cdev:struct cdev类型的指针变量,指向需要关联的字符设备结构体;//fops:file_operations类型的结构体指针变量,一般将实现操作该设备的结构体file_operations结构体作为实参。注册
注册以下功能
int cdev_add(struct cdev *p, dev_t dev, unsigned count)//p:struct cdev类型的指针,用于指定需要添加的字符设备;//dev:dev_t类型变量,用于指定设备的起始编号;//count:指定注册多少个设备。只有注册后,才能通过后续操作创建设备节点。
取消
void cdev_del(struct cdev *p)//p:struct cdev类型的指针,用于指定需要添加的字符设备。//注册和注销是配对的,注销函数实在删除设备时执行的。我代码的一部分
cdev_init(&cdev,&fops);ret = cdev_add(&cdev, devno, 1);if(ret版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 ZLME@xxxxxxxx@hotmail.com 举报,一经查实,立刻删除。