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

这篇具有很好参考价值的文章主要介绍了linux基础:野火i.mx 6ull上手。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

屏蔽驱动打印信息

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不一样)。

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

 

连接操作

终端输入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;
}

 文章来源地址https://www.toymoban.com/news/detail-639783.html

到了这里,关于linux基础:野火i.mx 6ull上手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • I.MX6ULL_Linux_驱动篇(42)设备树与platform设备驱动

    上一章我们详细的讲解了 Linux 下的驱动分离与分层,以及总线、设备和驱动这样的驱动框架。基于总线、设备和驱动这样的驱动框架, Linux 内核提出来 platform 这个虚拟总线,相应的也有 platform 设备和 platform 驱动。上一章我们讲解了传统的、未采用设备树的 platform 设备和驱

    2024年02月14日
    浏览(9)
  • I.MX6ULL_Linux_驱动篇(45)linux INPUT子系统

    I.MX6ULL_Linux_驱动篇(45)linux INPUT子系统

    按键、鼠标、键盘、触摸屏等都属于输入(input)设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input 框 架,用户只需要负责上报输入事件,比如按键值、坐标等信息, input 核心层负责处理这些

    2024年02月14日
    浏览(19)
  • I.MX6ULL_Linux_驱动篇(39) 阻塞和非阻塞IO

    I.MX6ULL_Linux_驱动篇(39) 阻塞和非阻塞IO

    阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式,在编写驱动的时候一定要考虑到阻塞和非阻塞。本章我们就来学习一下阻塞和非阻塞 IO,以及如何在驱动程序中处理阻塞与非阻塞,如何在驱动程序使用等待队列和 poll 机制。 阻塞和非阻塞简介 这里的“IO”

    2024年02月12日
    浏览(22)
  • I.MX6ULL ARM驱动开发---网络设备驱动框架

    I.MX6ULL ARM驱动开发---网络设备驱动框架

      网络驱动是 linux 里面驱动三巨头之一,linux 下的网络功能非常强大,嵌入式 linux 中也常常用到网络功能。前面我们已经讲过了字符设备驱动和块设备驱动,本章我们就来学习一下 linux 里面的网络设备驱动。   网络设备驱动程序的体系结构分为4层,依次为网络协议驱

    2023年04月17日
    浏览(7)
  • 016——DHT11驱动开发(基于I.MX6uLL)

    016——DHT11驱动开发(基于I.MX6uLL)

    目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验         DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器,会测量空气中湿度,再根据测量结果决定是否继续加湿。DHT11 数字温湿度传感器是一款含有已

    2024年04月16日
    浏览(8)
  • 012——LED模块驱动开发(基于I.MX6uLL)

    012——LED模块驱动开发(基于I.MX6uLL)

    目录 一、 硬件原理图 二、 驱动程序 三、 应用程序 四、 Makefile 五、操作         又是非常经典的点灯环节 ,每次学新语言第一步都是hello world,拿到新板子或者学习新的操作系统,第一步就是点灯。         LED 的驱动方式,常见的有四种。 ① 使用引脚输出 3.3V 点

    2024年04月13日
    浏览(8)
  • [Linux_IMX6ULL驱动开发]-基础驱动

    [Linux_IMX6ULL驱动开发]-基础驱动

    如何理解嵌入式的驱动呢,我个人认为,驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态,是无法直接操控底层的硬件的。我们需要利用系统调用(open、read、write等),进入内核态,通过打开对应的设备节点,通过read、write等通过编写的驱动函数来操

    2024年04月09日
    浏览(8)
  • linux进阶-I.MX 6ULL

    linux进阶-I.MX 6ULL

    目录 启动模式(8引脚设置启动模式) 对应原理图 boot ROM程序 空偏移 映像向量表(Image vector table,IVT) IVT结构体 Boot data DCD(外设寄存器配置信息,初始化关键外设) NXP官方I.MX 6ULL开发SDK 三大模式: 熔丝:烧录一次,发布产品。 外部:USB、串口等。 内部:SD卡、EMMC、NA

    2024年02月15日
    浏览(9)
  • i.MX6ULL驱动开发 | 27 - 使用WM8960 CODEC播放音频

    i.MX6ULL驱动开发 | 27 - 使用WM8960 CODEC播放音频

    WM8960是欧胜公司(wolfson)的一款低功耗、高质量的立体声音频编解码芯片。 其内部集成D类喇叭功放,每个通道可以驱动一个1W喇叭(8Ω),内部集成3个立体声输入源,可以灵活配置,拥有一路完整的麦克风接口。 WM8960内部ADC和DAC都为24位,主要特性如下: DAC的SNR(信噪比)

    2024年02月02日
    浏览(10)
  • 017——DS18B20驱动开发(基于I.MX6uLL)

    017——DS18B20驱动开发(基于I.MX6uLL)

    目录 一、 模块介绍 1.1 简介 1.2 主要特点 1.3 存储器介绍 1.4 时序 1.5 命令 1.5.1 命令大全    1.5.2 命令使用 1.5.3 使用示例 1.6 原理图 二、 驱动程序 三、 应用程序 四、 测试         DS18B20 温度传感器具有线路简单、体积小的特点,用来测量温度非常简单,在一根通信线上

    2024年04月12日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包