基于Linux_ARM板的驱动烧写及连接挂载详细过程(附带驱动程序)
Posted 比特冬哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Linux_ARM板的驱动烧写及连接挂载详细过程(附带驱动程序)相关的知识,希望对你有一定的参考价值。
文章目录
前言
本文操作环境:Ubuntu14.04、GEC6818
这里为似懂非懂的朋友简单叙述该文章的具体操作由来,我们的主要目的是将写好的驱动程序烧进开发板中,看到我们想要的现象。
第一个,我们需要让开发板和Linux平台建立联系,这样我们才能让俩者进行更好的交互,这个中间件网上有许多,这里我以putty为例连接展示。
第二个,在Linux上交叉编译好的可执行文件需要上传到中间件上运行,这里需要使用nfs服务挂载到开发板上。
第三个,在该ARM板上,厂商已为客户写入部分内核驱动模块。
一、搭建nfs服务
- 在Linux下打开终端,输入命令:
sudo apt-get install nfs-kernel-server
- 设置共享目录。在Linux上设置一个共享目录,方便之后步骤中一些文件的存放以及使用,在终端中输入命令:
sudo mkdir -p /home/incipe/nfs
sudo chmod 777 /home/incipe/nfs
vim /etc/exports //(在exports下面添加如在语句)
/home/incipe/nfs (rw)
- 重启NFS服务,确保上面两步完成,终端中输入命令:
sudo /etc/init.d/nfs-kernel-server restart
看到有四个OK出现即为设置成功。
二、ARM板的硬件连接
所需为一块ARM板、一根串口线、一根网线、一根电源线。
三、putty连接
使用母头串口线、网线、电源线将QT6818开发板与我们电脑相连,查看端口,然后打开我们的Putty,将端口号填写好,然后比特流改成115200,然后开启开发板和Putty。
至此,putty连接ARM板成功!
四、挂载共享文件夹
- 相互ping通
查看开发板、Ubuntu的IP地址,修改开发板、Ubuntude IP地址。先在Ubuntu和开发板上查看其IP地址,输入命令:ifconfig,然后我们要将Ubuntu的IP地址改成和开发板一个网段的地址。改装完之后在Ubuntu上再输入ifconfig命令,查看是否改装成功。
查看IP地址命令:ifconfig
更改IP地址命令:ifconfig eth0 xxx.xxx.x.xxx
更改为同一网段后相互ping通:ping xxx.xxx.x.xxx
- 交叉编译
将编译好的驱动程序复制到之前创建的共享文件夹 /home/incipe/nfs
(以下是在Linux终端执行)
cp /mnt/hgfs/Ubuntu14.04_share/led_test.c /home/incipe/nfs/
在/home/incipe/nfs 文件中交叉编译led_test.c文件
(此前需要安装交叉编译环境)
arm-linux-gcc -o led_test led_test.c
- 挂载
将交叉编译生成的led_test可执行文件挂载到开发板,在putty上执行如下语句实现挂载:
mount -t nfs 192.168.1.180:/home/incipe/nfs /mnt/sd -o nolock
其中
192.168.1.180:/home/incipe/nfs
为Linux IP地址及Linux下的共享文件夹
/mnt/sd
为挂载在开发板上地址
可见,挂载成功。
五、烧写驱动程序
此前,你需知道的常见驱动命令:
- uname命令
用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等) - lsmod命令
用于显示已经加载到内核中的模块的状态信息。 - rmmod命令
用于从当前运行的内核中移除指定的内核模块。 - insmod命令
用于将给定的模块加载到内核中。 - dmesg命令
用于检查和控制内核的环形缓冲区。 - get_module命令
用于获取Linux内核模块的详细信息。
接下来,我以上方已加载的led驱动模块为例,烧入驱动程序
先观察烧入前板子上的 led 状态(默认状态全亮)
运行已挂载的可执行文件: ./led_test
输入数字“4”和“6”表示关闭第2个和第3个led灯,观察现象:
观察可知,第二个和第三个led灯成功关闭。
六、驱动程序示例
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#define TEST_MAGIC 'x' //定义幻数
#define TEST_MAX_NR 2 //定义命令的最大序数
//定义LED的魔幻数
#define LED1 _IO(TEST_MAGIC, 0)
#define LED2 _IO(TEST_MAGIC, 1)
#define LED3 _IO(TEST_MAGIC, 2)
#define LED4 _IO(TEST_MAGIC, 3)
/*************************************************
*主函数-实现led的控制
*************************************************/
int main(int argc, char **argv)
int fd,val;
fd = open("/dev/Led",O_RDWR); //打开设备下的LED,成功返回0
if(fd<0)
perror("Can not open /dev/LED\\n");
return 0;
while(1)
val = 0;
printf("**********************************************\\n");
printf("*please select which light to turn on *\\n");
printf("* 1->1:on 2 ->1:off | 3 ->2:on 4 ->2:off *\\n");
printf("*------------------------------------------- *\\n");
printf("* 5->3:on 6 ->3:off | 7 ->4:on 8 ->4:off *\\n");
printf("**********************************************\\n");
scanf("%d",&val);
while(val == 0)
printf("****************\\n");
scanf("%d",&val);
//printf("***********val = %d\\n",val);
switch(val)
case 1:
ioctl(fd, LED1, 0); //1灯亮
break;
case 2:
ioctl(fd, LED1, 1); //1灯灭
break;
case 3:
ioctl(fd, LED2, 0); //2灯亮
break;
case 4:
ioctl(fd, LED2, 1); //2灯灭
break;
case 5:
ioctl(fd, LED3, 0); //3灯亮
break;
case 6:
ioctl(fd, LED3, 1); //3灯灭
break;
case 7:
ioctl(fd, LED4, 0); //4灯亮
break;
case 8:
ioctl(fd, LED4, 1); //4灯灭
break;
default:
close(fd);
return 0;
close(fd);
return 0;
以上是关于基于Linux_ARM板的驱动烧写及连接挂载详细过程(附带驱动程序)的主要内容,如果未能解决你的问题,请参考以下文章
tiny4412u-boot烧写及根文件系统制作(不进入终端问题)