屏蔽驅動列印信息 root許可權:echo "1 4 1 7" > /proc/sys/kernel/printk sudo sh -c "sudo echo "1 4 1 7" > /proc/sys/kernel/printk 實現觸摸屏校驗 第一次進入Linux系統時,會出現觸摸校驗提示,按提示 ...
屏蔽驅動列印信息
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; }