目录
屏幕驱动打印信息
实现触摸屏校验
开发板连接WIFI
连接操作
申请路由器动态IP和ping网络通断
WiFi信息保存位置
常用wifi操作(wpa_cli工具)
NFS网络文件系统共享
虚拟机安装NFS服务器
开发板安装NFS客户端
控制开发板
找出硬件设备所对应的设备节点文件
找出驱动程序规定的设备文件使用方式
硬件命令行控制
文件管理控制硬件
LED灯
蜂鸣器
按键输入检测
屏幕驱动打印信息
root权限:echo "1 4 1 7" > /proc/sys/kernel/printk 或
sudo sh -c "sudo echo "1 4 1 7" > /proc/sys/kernel/printk
实现触摸屏校验
第一次进入Linux系统时,会出现触摸校验提示,按提示校准5个点就可以了。
如果想重新校验,需进入root权限执行操作。
rm /etc/pointercal(删除校准文件)
reboot(重启开发板)
此时就可以重新校验触摸屏了。
开发板连接WIFI
SD卡和WIFI共用同一SDIO接口(需注意跳线帽的连接),cat /etc/issue可查看镜像(不同镜像fire-config不一样)。
连接操作
终端输入sudo fire-config(打开野火配置工具),选择Network--WiFi config--Onboard Enable/Disable the on board WiFi of npi-Pro board--Enable--Finish--Yes(重启)。
重启完毕后,重新终端输入sudo fire-config,选择Network--WiFi config--WiFi scan。然后选择WiFi,输入名称、密码。返回首页,选择Finish。
终端输入sudo ifconfig查看网络连接状态。
申请路由器动态IP和ping网络通断
udhcpc -b -i wlan0
ping www.baidu.com
WiFi信息保存位置
打开WiFI账号密码配置文件:sudo vim /etc/wpa_supplicant/wpa_supplicant.conf
常用wifi操作(wpa_cli工具)
sudo ifconfig wlan0 down:关闭wifi
sudo ifconfig wlan0 up:启动wifi
wpa_cli -i wlan0 status:查看当前连接状态
wpa_cli -i wlan0 list_networks:列出输入过的网络
wpa_cli -i wlan0 disconnect AP1:断开当前连接AP1名Wifi
wpa_cli -i wlan0 reconnect AP1:重新连接AP1名Wifi或其他
wpa_cli -i wlan0 select_network AP2:切换连接list_networks里的AP2名Wifi
wpa_cli -i wlan0 remove_network AP2:删除不用的AP1名Wifi(删除前需断开)
wpa_cli -i wlan0 save_config:保存配置(如执行完上诉删除操作,需要执行保存,否则重启后重新使用上次配置)
NFS网络文件系统共享
虚拟机安装NFS服务器
更新软件列表:sudo apt-get update
安装NFS服务器:sudo apt-get install nfs-kernel-server -y(安装完成后会生成/etc/exports文件)
创建共享文件夹:sudo mkdir -p /home/couvrir/桌面/sharedir
打开/etc/exports添加配置信息:/home/couvrir/桌面/sharedir *(rw,sync,no_root_squash)
更新exports配置:sudo exportfs -arv
查看NFS共享情况:showmount -e
*代表所有网段的主机都能够访问(读写权限,同步,root权限)。同步是指对文件夹进行读写时,它是实时地写入到磁盘里,不会一直存在于缓冲区。no_root_squash是指root用户具有挂在目录的全部操作权限。
开发板安装NFS客户端
更新软件列表:sudo apt-get update
安装NFS客户端:sudo apt-get install nfs-common -y
查看NFS服务器共享文件夹目录:showmount -e "NFS服务器IP"
挂载NFS文件系统:sudo mount -t nfs "NFS服务器IP":/home/couvrir/桌面/sharedir /mnt
控制开发板
找出硬件设备所对应的设备节点文件
/dev目录:对驱动程序熟悉的工程师可以使用,一个设备节点文件控制硬件全部特性。
/sys目录:业余程序员使用,一个设备节点文件只控制硬件的一个特性。严格来说,它的文件是Linux内核导出到用户空间的硬件操作接口。
找出驱动程序规定的设备文件使用方式
Linux系统引脚编号规则(针对i.MX 6ull):(组号 - 1)* 32 + 组内引脚编码。例如GPIO1_19,组号为1,组内引脚编码为19,所以GPIO1_19在Linux内核的引脚编号为19。
/sys/class/gpio/export:导出GPIO子系统硬件操作接口。
/sys/class/gpio/gpio19/direction:控制芯片引脚的输入输出模式。in--输入,out--输出。
/sys/class/gpio/gpio19/value:控制芯片引脚的输出电平。1--高电平,0--低电平。
硬件命令行控制
sudo sh -c 'sudo echo 255 > /sys/class/leds/blue/brightness:调蓝色LED至最亮
sudo sh -c 'sudo echo 0 > /sys/class/leds/blue/brightness:调蓝色LED至最暗
sudo echo 19 > /sys/class/gpio/export
sudo sh -c "sudo echo out > /sys/class/gpio/gpio19/direction"
sudo sh -c "sudo echo 1 > /sys/class/gpio/gpi19/value"
文件管理控制硬件
LED灯
led.c文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
//ARM 开发板LED设备的路径
#define RLED_DEV_PATH "/sys/class/leds/red/brightness"
#define GLED_DEV_PATH "/sys/class/leds/green/brightness"
#define BLED_DEV_PATH "/sys/class/leds/blue/brightness"
int main(int argc, char* argv[])
{
int red_fd, green_fd, blue_fd;
int res = 0;
printf("This is the led demo\n");
//获取红灯的设备文件描述符
red_fd = open(RLED_DEV_PATH, O_WRONLY);
if(r_fd < 0)
{
printf("Fail to Open %s device\n", RLED_DEV_PATH);
exit(1);
}
//获取绿灯的设备文件描述符
green_fd = open(GLED_DEV_PATH, O_WRONLY);
if(r_fd < 0)
{
printf("Fail to Open %s device\n", GLED_DEV_PATH);
exit(1);
}
//获取蓝灯的设备文件描述符
blue_fd = open(BLED_DEV_PATH, O_WRONLY);
if(r_fd < 0)
{
printf("Fail to Open %s device\n", BLED_DEV_PATH);
exit(1);
}
while(1)
{
write(red_fd, "255", 3);
sleep(1);
write(red_fd, "0", 1);
write(green_fd, "255", 3);
sleep(1);
write(green_fd, "0", 1);
write(blue_fd, "255", 3);
sleep(1);
write(blue_fd, "0", 1);
}
}
蜂鸣器
beep.h文件
#ifndef _BSP_BEEP_H
#define _BSP_BEEP_H
//蜂鸣器的GPIO引脚号
//i.mx 6ull 计算方式:GPIOn_IOx = (n-1)*32 + x
//如GPIO1_IO19 = (1-1)*32 + 19 = 19
#define BEEP_GPIO_INDEX "19"
/**
* @brief 初始化蜂鸣器GPIO
* @return
* @arg 0:正常
* @arg 1:export文件打开错误
* @arg 2:direction文件打开错误
**/
extern int beep_init(void);
/**
* @brief 关闭蜂鸣器GPIO的export输出
* @return
* @arg 0:正常
* @arg !0:value文件打开错误
**/
extern int beep_deinit(void);
/**
* @brief 蜂鸣器响
* @return
* @arg 0:正常
* @arg !0:value文件打开错误
**/
extern int beep_on(void);
/**
* @brief 关闭蜂鸣器GPIO的export输出
* @return
* @arg 0:正常
* @arg !0:unexport文件打开错误
**/
extern int beep_off(void);
#endif
beep.c文件
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include "../include/beep.h"
int beep_init(void)
{
int fd;
char gpio_path_direction[40] = {0};
/*******************索引配置********************/
fd = open("/sys/class/gpio/export", O_WRONLY);
if(fd < 0)
return 1;
write(fd, BEEP_GPIO_INDEX, strlen(BEEP_GPIO_INDEX));
close(fd);
/*******************索引配置********************/
/*******************方向配置********************/
sprintf(gpio_path_direction, "/sys/class/gpio/gpio%d/direction", BEEP_GPIO_INDEX);
fd = open(gpio_path_direction, O_WRONLY);
if(fd < 0)
return 2;
write(fd, "out", strlen("out"));
close(fd);
/*******************方向配置********************/
return 0;
}
int beep_deinit(void)
{
int fd;
fd = open("/sys/class/gpio/unexport", O_WRONLY);
if(fd < 0)
return 1;
write(fd, BEEP_GPIO_INDEX, strlen(BEEP_GPIO_INDEX));
close(fd);
return 0;
}
int beep_on(void)
{
int fd;
char gpio_value[40] = {0};
sprintf(gpio_value, "/sys/class/gpio/gpio%d/value", BEEP_GPIO_INDEX);
fd = open(gpio_value, O_WRONLY);
if(fd < 0)
return 1;
write(fd, "1", 1);
close(fd);
}
int beep_off(void)
{
int fd;
char gpio_value[40] = {0};
sprintf(gpio_value, "/sys/class/gpio/gpio%d/value", BEEP_GPIO_INDEX);
fd = open(gpio_value, O_WRONLY);
if(fd < 0)
return 1;
write(fd, "0", 1);
close(fd);
rerurn 0;
}
main.c文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include "../include/beep.h"
int main(int argc, char* argv[])
{
int res = 0;
char buf[10];
printf("This is the beep demo\n");
res = beep_init();
if(res)
{
printf("beep init error, code = %d\n", res);
return 0;
}
while(1)
{
printf("please input the value: 0--off 1--on q--exit\n");
scanf("%10s", buf);
switch(buf[0])
{
case '0':
beep_off();
break;
case '1':
beep_on();
break;
case 'q':
beep_deinit();
printf("Exit\n");
return 0;
default:
break;
}
}
}
按键输入检测
key按键的设备文件:/dev/input/by-path/platform-gpio-keys-event
struct input_event
{
struct timeval time; //记录输入事件的时间戳
__u16 type; //记录输入事件的类型,比如按键输入、坐标输入、特殊类型(EV_SYN,同步事件,提醒我们及时处理已经发生的完成输入事件)
__u16 code; //记录输入类型的具体事件代号,比如键盘发生按键输入类型事件时,记录键盘哪个值被按下
__s32 value; //记录事件的具体值,比如按键输入类型事件里,1--按键被按下,0--按键被弹起
};
input子系统:按键、键盘、鼠标、触摸屏等。
main.c文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <linux/input-event-codes.h>
//开发板的KEY按键,请根据实际情况修改
const char default_path[] = "/dev/input/by-path/platform-gpio-keys-event";
int main(int argc, char* argv[])
{
int fd;
struct input_event event;
char *path;
printf("This is a input device demo\n");
//若无输入参数则使用默认事件设备
if(argc > 1 )
path = argv[1];
else
path = (char *)default_path;
fd = open(path, O_RDONLY);
if(fd < 0)
{
printf("Fail to open device:%s\n", path);
exit(1);
}
printf("Test device:%s\n", input);
while(1)
{
if( read(fd, &event, sizeof(event)) == sizeof(event))
{
//EV_SYN是事件分隔标志,不打印
if(event.type != EV_SYN)
{
printf("Event:time %ld.%ld,type %d,code %d,value %d\n",
event.time.tv_sec, event.time.tv_usec,
event.type,
event.code,
event.value);
}
}
}
close(fd);
return 0;
}