linux基礎:野火i.mx 6ull上手

来源:https://www.cnblogs.com/couvrir/archive/2023/08/10/17621053.html
-Advertisement-
Play Games

屏蔽驅動列印信息 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;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發`winfrom`應用時,經常遇到異常:`System.InvalidOperationException:“線程間操作無效: 從不是創建控制項“xxxx”的線程訪問它。`出現這個異常的原因是創建這個UI的線程,和當前訪問這個UI的線程不會是同一個。Winform為了防止線程不安全,因此對這個跨... ...
  • # Unity AssetPostprocessor模型相關函數詳解 在Unity中,AssetPostprocessor是一個非常有用的工具,它可以在導入資源時自動執行一些操作。在本文中,我們將重點介紹AssetPostprocessor中與模型相關的函數,並提供多個使用例子。 ## OnPost ...
  • OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的電腦視覺庫。OpenCV是由英特爾公司發起並參與開發,以BSD許可證授權發行,可以在商業和研究領域中免費使用。OpenCV可用於開發實時的圖像處理電腦視覺以及模式識別程式。該程式庫也可以使用 ...
  • 本篇文章將帶你認識C#的新語法、創建項目、發佈運行、讀取的相關操作、MVC開發、擴展、各種容易的使用,許可權等.NET的相關知識。帶你從零到精通,全面掌握.NET5的開發技能。 ...
  • DrawingBrush 背景圖 Background上畫,線條(LineGeometry)、幾何圖形(RectangleGeometry)、橢圓(EllipseGeometry)、弧線(ArcSegment )等。 屬性 說明 描述 <GeometryDrawing Brush="Orange"> ...
  • 前面講了Centos如何安裝telnet遠程,這次分享Ubuntu系統如何安裝遠程telnet,作為咱們運維備用遠程途徑 一、下載和安裝 查看系統版本:Ubuntu 22.04.1 LTS 線上安裝: apt install telnet telnetd openbsd-inetd 離線安裝: 離線 ...
  • # Docker概述 ## Docker為何要出現 由於傳統的方式,不能打包環境,而環境的配置也及其繁瑣,及其耗費時間,而docker就可以非常有效的解決這個問題 **docker的思想來源於集裝箱,docker的核心思想!打包裝箱,也就是說每個箱子都是隔開的,docker通過這種機制可以吧伺服器利 ...
  • 提要:本系列文章主要參考`MIT 6.828課程`以及兩本書籍`《深入理解Linux內核》` `《深入Linux內核架構》`對Linux內核內容進行總結。 記憶體管理的實現覆蓋了多個領域: 1. 記憶體中的物理記憶體頁的管理 2. 分配大塊記憶體的伙伴系統 3. 分配較小記憶體的slab、slub、slob分 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...