女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【PHYTEC開發(fā)板試用體驗】2 實現(xiàn)一個酷炫霓虹燈_Part-B

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-12-05 11:12 ? 次閱讀
本文來源電子發(fā)燒友社區(qū),作者:jf_00240724, 帖子地址:https://bbs.elecfans.com/jishu_2284706_1_1.html

今天我們接上一篇繼續(xù),需要做兩個事情。第一個是重寫驅(qū)動,第二個是開發(fā)霓虹燈應(yīng)用程序。

第一章 重寫驅(qū)動
一.1. 知識儲備
一.1.1. 卸載驅(qū)動
一.1.1.1. linux加載/卸載驅(qū)動有兩種方法


一.1.1.1.1. modprobe

這里我們主要用這個。

注:在使用這個命令加載模塊前先使用depmod -a命令生成modules.dep文件,該文件位于/lib/modules/$(uname -r)目錄下;modprobe命令智能地向內(nèi)核中加載模塊或者從內(nèi)核中移除模塊,可載入指定的個別模塊,或是載入一組相依的模塊。modprobe會根據(jù)depmod所產(chǎn)生的依賴關(guān)系,決定要載入哪些模塊。若在載入過程中出錯,modprobe會卸載整組的模塊。

載入模塊的命令:

(1) 載入指定的模塊:modprobe drv.ko

(2) 載入全部模塊:modprobe -a

卸載模塊的命令:modprobe -r drv.ko

modprobe命令用于智能地向內(nèi)核中加載模塊或者從內(nèi)核中移除模塊。

modprobe可載入指定的個別模塊,或是載入一組相依的模塊。modprobe會根據(jù)depmod所產(chǎn)生的相依關(guān)系,決定要載入哪些模塊。若在載入過程中發(fā)生錯誤,在modprobe會卸載整組的模塊。

選項

-a或--all:載入全部的模塊;

-c或--show-conf:顯示所有模塊的設(shè)置信息;

-d或--debug:使用排錯模式;

-l或--list:顯示可用的模塊;

-r或--remove:模塊閑置不用時,即自動卸載模塊;

-t或--type:指定模塊類型;

-v或--verbose:執(zhí)行時顯示詳細的信息;

-V或--version:顯示版本信息;

-help:顯示幫助。

參數(shù) 模塊名:要加載或移除的模塊名稱。


實例

查看modules的配置文件:modprobe -c

這里,可以查看modules的配置文件,比如模塊的alias別名是什么等。會打印許多行信息,例如其中的一行會類似如下:

alias symbol:ip_conntrack_unregister_notifier ip_conntrack

列出內(nèi)核中所有已經(jīng)或者未掛載的所有模塊:modprobe -l

這里,我們能查看到我們所需要的模塊,然后根據(jù)我們的需要來掛載;其實modprobe -l讀取的模塊列表就位于/lib/modules/`uname -r`目錄中;其中uname -r是內(nèi)核的版本,例如輸出結(jié)果的其中一行是:

/lib/modules/2.6.18-348.6.1.el5/kernel/net/netfilter/xt_statistic.ko

掛載vfat模塊:modprobe vfat

這里,使用格式modprobe 模塊名來掛載一個模塊。掛載之后,用lsmod可以查看已經(jīng)掛載的模塊。模塊名是不能帶有后綴的,我們通過modprobe -l所看到的模塊,都是帶有.ko或.o后綴。

移除已經(jīng)加載的模塊:modprobe -r 模塊名

這里,移除已加載的模塊,和rmmod功能相同。

一.1.1.1.2. rmmod

這個卸載命令不會把其依賴模塊一同卸掉,所以這里我們只作簡單介紹。
一.1.2. Linux驅(qū)動框架

接下來,我們開始重新寫驅(qū)動,linux系統(tǒng)下寫驅(qū)動,其實就是配置相應(yīng)的硬件寄存器,那本章的霓虹燈驅(qū)動,也就是對imX 8的GPIO進行配置,由于裸機實驗不同的是,并且驅(qū)動要符合linux驅(qū)動框架,下面我們來先理解了解一下linux的驅(qū)動框架。

一.1.2.0.1. 地址映射

linux的驅(qū)動,并不能夠直接操作寄存硬件寄存器,而是需要通過MMU即內(nèi)存管理單元,它的主要功能是
一、以完成虛擬空間的物理空間的映射
二、內(nèi)存保護設(shè)置存儲器的訪問權(quán)限,設(shè)置虛擬存儲空間的緩沖特性

這里我們會用到兩個函數(shù)ioremap,iounmap,它們分別是用來獲取物理地址空間對應(yīng)的虛擬地址,和卸載時釋放掉之前所做的映射

一.1.2.0.2. linux內(nèi)存訪問函數(shù)

對于arm來說,只有IO內(nèi)存,linux內(nèi)核建議使用一組操作函數(shù)來對映射后的內(nèi)存進行讀寫操作
一、讀操作函數(shù)
<

1 u8 readb(constvolatilevoid __iomem *addr)

2 u16 readw(constvolatilevoid __iomem *addr)

3 u32 readl(constvolatilevoid __iomem *addr)

>

readb、readw和readl這三個函數(shù)分別對應(yīng)8bit、16bit和32bit讀操作,參數(shù)addr就是要讀取寫內(nèi)存地址,返回值就是讀取到的數(shù)據(jù)。

二、寫操作函數(shù)

<

1void writeb(u8 value,volatilevoid __iomem *addr)

2void writew(u16 value,volatilevoid __iomem *addr)

3void writel(u32 value,volatilevoid __iomem *addr)

>

writeb、writew和writel這三個函數(shù)分別對應(yīng)8bit、16bit和32bit寫操作,參數(shù)value是要寫入的數(shù)值,addr是要寫入的地址。

接下來我們開始搭建一個linux驅(qū)動框架:
<

#include "linux/init.h"

#include "linux/module.h"

#include "linux/fs.h"

#include "linux/types.h"

// struct inode 聲明在 linux/fs.h 中

// struct file 聲明在 linux/fs.h 中

int led_open (struct inode *i, struct file *f)

{

// printk 聲明在 linux/printk.h 中

printk("led open!rn");

return 0;

}

int led_release (struct inode *i, struct file *f)

{

printk("led release!rn");

return 0;

}

// ssize_t 定義在 linux/types.h 中

// __user 定義在 linux/compiler.h 中

// size_t 定義在 linux/types.h 中

// loff_t 定義在 linux/types.h 中

ssize_t led_read (struct file *f, char __user *b, size_t c, loff_t * l)

{

printk("led read!rn");

return 0;

}

ssize_t led_write (struct file *f, const char __user *b, size_t c, loff_t *l)

{

printk("led write!rn");

return 0;

}

// 聲明在 linux/fs.h 頭文件中

static struct file_operations fops = {

.open = led_open,

.release = led_release,

.read = led_read,

.write = led_write,

};

/* 驅(qū)動入口函數(shù) */

static int __init led_init(void)

{

/* 入口函數(shù)具體內(nèi)容 */

int retvalue = 0;

// 聲明在 linux/fs.h 頭文件中

retvalue = register_chrdev(200,"chrdev",&fops);

if(retvalue < 0){

/* 字符設(shè)備注冊失敗 */

}

return 0;
}

/* 驅(qū)動出口函數(shù) */

static void __exit led_exit(void)

{

/* 出口函數(shù)具體內(nèi)容 */

// 聲明在 linux/fs.h 頭文件中

unregister_chrdev(200,"chrdev");

}

// 聲明在 linux/init.h 頭文件中

/* 將上面兩個函數(shù)指定為驅(qū)動的入口和出口函數(shù) */

module_init(led_init);

module_exit(led_exit);

// 聲明在 linux/module.h 頭文件中

MODULE_LICENSE("GPL");

>

這只是一個驅(qū)動框架沒有實際內(nèi)容。

一.2. 硬件準備

接下來我們要找到電路原理圖,和主芯片的操作手冊從而找到LED燈對應(yīng)的哪一個引腳以及其對應(yīng)的寄存器。

在如下鏈接中我們找到這樣一句話,好吧,原來他并不是GPIO控制的,而是一個iic芯片PCA9533中轉(zhuǎn)控制的,不得不說這個硬件設(shè)計讓人匪夷所思啊。

Multicolor (RGB) LED (D24)

The phyBOARD-Pollux provides one multicolor (RGB) LED (D24) (see phyBOARD-Pollux Components (Top)). The LEDs are connected to a LED driver (NXP PCA9533/01) controlled by I2C2 bus.

https://www.phytec.de/cdocuments ... wareManual-LEDsLEDs

一.3. 軟件-實操

一.3.1. 驅(qū)動卸載

基于以上的知識儲備,本來想嘗試一下卸載得掉leds這個驅(qū)動?但最終發(fā)現(xiàn)不是我們以上準備的驅(qū)動框架,而是sysfs的驅(qū)動框架,稍微研究一下,發(fā)現(xiàn)有點難度,值得針對性的再寫一篇。

在此我們就不去卸載了。

一.3.2. 驅(qū)動編寫

等研究好了sysfs驅(qū)動框架后,再實操一遍iic驅(qū)動編寫。

第二章 應(yīng)用程序

二.1. 代碼

這里直接上代碼:
二.1.1. Leds_app.h
<

typedef enum{

LED1_RED = 1,

LED2_GREEN,

LED3_BULE

}LED_ID;

int leds_control(LED_ID led_id,unsigned char brightness)

>
二.1.2. Leds_app.c

<

int leds_control(LED_ID led_id,unsigned char brightness)

{

int fd = 0;

int ret = 0,len;

/*this buffer size is sufficient to store file path */

char buf[128];

//printf("enter leds_controlrn");

snprintf(buf, sizeof(buf), "/sys/class/leds/user-led%d/brightness",led_id);

fd = open(buf, O_RDWR);

if(fd < 0){

printf("Can't open file %srn", buf);

return -1;

}

len = snprintf(buf, sizeof(buf),"%d", brightness);

ret =write(fd, buf, len);

if (ret < 0)

perror("sysfs_led_write:");

ret = close(fd);

if(ret < 0){

printf("Can't close file for led%drn", led_id);

return -1;

}

// printf("leaveleds_controlrn");

return 0;

}

>
二.1.3. Main.c

<

#include

#include

#include

#include "stdio.h"

#include "leds_app.h"

int main(int argc, char *argv[])

{

int led1_value,led2_value,led3_value;

while (1) {

led1_value = rand()%255;

led2_value = rand()%255;

led3_value = rand()%255;

printf("led1:%3d led2:%3d led3:%3dn",led1_value,led2_value,led3_value);

leds_control(LED3_BULE,0);

leds_control(LED1_RED,led1_value);

sleep(0.9);

//leds_control(LED1_RED,0);

leds_control(LED2_GREEN,led2_value);

sleep(0.8);

leds_control(LED2_GREEN,0);

leds_control(LED3_BULE,led3_value);

sleep(0.5);

}
}

>
二.2. Log

打印出如下log

<

10:48:51: Starting /opt/HelloQuick/bin/HelloQuick ...

Warning: Identity filenot accessible: No such file or directory.

QML debugging is enabled. Only use this in a safe environment.

led1:163 led2:151 led3:162

led1: 85 led2: 83 led3:190

led1:241 led2:252 led3:249

led1:121 led2:107 led3: 82

led1: 20 led2: 19 led3:233

led1:226 led2: 45 led3: 81

led1:142 led2: 31 led3: 86

led1:8 led2: 87 led3: 39

led1:167 led2:5 led3:212

...

>
二.3. 看效果:
請觀看底部視頻



霓虹燈效果

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led
    led
    +關(guān)注

    關(guān)注

    242

    文章

    23715

    瀏覽量

    671118
  • 霓虹燈
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    17080
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5538

    瀏覽量

    102480
  • PHYTEC
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    3773
  • 開發(fā)板試用
    +關(guān)注

    關(guān)注

    3

    文章

    301

    瀏覽量

    2330
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    PHYTEC開發(fā)板試用體驗】1 實現(xiàn)霓虹燈_Part A

    節(jié)我們將會對板子進行上電,并做一個簡單的實驗,那就是實現(xiàn)
    的頭像 發(fā)表于 12-05 11:14 ?1354次閱讀
    【<b class='flag-5'>PHYTEC</b><b class='flag-5'>開發(fā)板</b><b class='flag-5'>試用</b>體驗】1 <b class='flag-5'>實現(xiàn)</b><b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>酷</b><b class='flag-5'>炫</b><b class='flag-5'>霓虹燈</b>_<b class='flag-5'>Part</b> A

    家用小型霓虹燈電路圖

    家用小型霓虹燈電路圖霓虹燈電子變壓器,包括電子電路和高壓包二部分。種形式為電子電路拖動
    發(fā)表于 10-07 19:12

    基于labview 實現(xiàn)霓虹燈

    基于labview 實現(xiàn)霓虹燈字體,流動閃爍效果!
    發(fā)表于 04-24 14:35

    PHYTEC開發(fā)板試用體驗】1 實現(xiàn)霓虹燈_Part A

    節(jié)我們介紹的開箱環(huán)節(jié),這節(jié)我們將會對板子進行上電,并做一個簡單的實驗,那就是實現(xiàn)
    發(fā)表于 05-28 11:50

    PHYTEC開發(fā)板試用體驗】2 實現(xiàn)霓虹燈_Part-B

    今天我們接上篇繼續(xù),需要做兩事情。第一個是重寫驅(qū)動,第二開發(fā)霓虹燈應(yīng)用程序。第
    發(fā)表于 06-05 11:40

    PHYTEC開發(fā)板試用體驗】3 通過開發(fā)板張照片

    1. 硬件準備接下來,我們的目的是做一個圖像識別相關(guān)的事情,但由于我們這個Phytec開發(fā)板它并沒有帶攝像頭外設(shè),所以我們需要給他裝
    發(fā)表于 06-12 14:43

    霓虹燈程序員指南

    如果您對ARM技術(shù)完全陌生,請閱讀Cortex-A系列程序員指南,了解有關(guān)ARM架構(gòu)配置文件和般編程指南的信息。 ·霓虹燈技術(shù)是ARM高級單指令多數(shù)據(jù)(SIMD)擴展的實現(xiàn)。 ·霓虹燈
    發(fā)表于 08-17 06:32

    霓虹燈電源電路

    霓虹燈電源電路
    發(fā)表于 01-31 23:44 ?2285次閱讀
    <b class='flag-5'>霓虹燈</b>電源電路

    霓虹燈的工作原理

    霓虹燈的工作原理 霓虹燈種低氣壓冷陽極輝光放電發(fā)光的光源。氣體放電發(fā)光是自然界的種物理現(xiàn)象。通過氣體放電使
    發(fā)表于 07-30 15:32 ?2.1w次閱讀

    實用霓虹燈電源電路

      實用霓虹燈電源
    發(fā)表于 07-31 08:16 ?1726次閱讀
    實用<b class='flag-5'>霓虹燈</b>電源電路

    熒光霓虹燈的區(qū)別

    熒光霓虹燈的區(qū)別 霓虹燈是廣告標志中常用的。這些標志由長而窄的玻璃管制成,常常彎曲成各種形狀。例如,
    發(fā)表于 08-21 14:50 ?5151次閱讀

    小型霓虹燈高頻變壓器設(shè)計及制作電路

    小型霓虹燈電路配套的小型霓虹燈高頻變壓器的制作參考如下。  霓虹燈變壓器(2-5W適合0.6米以下的燈管)
    發(fā)表于 06-01 08:30 ?4053次閱讀
    小型<b class='flag-5'>霓虹燈</b>高頻變壓器設(shè)計及制作電路

    簡易霓虹燈驅(qū)動電路

    簡易霓虹燈驅(qū)動電路中NE1是霓虹燈。這個簡單的逆變器電路點亮了它。T1是20:1的匝數(shù)比
    發(fā)表于 12-17 00:02 ?6043次閱讀
    簡易<b class='flag-5'>霓虹燈</b>驅(qū)動電路

    霓虹燈

    基于51單片機霓虹燈控制電路的程序,全部程序以及hexwen文件。
    發(fā)表于 05-06 14:37 ?15次下載

    霓虹燈的制作教程

     我通常討厭RGB LED,盡可能堅持使用暖白色。但是“俗氣”的顏色確實讓人覺得這是霓虹燈。 (當然霓虹燈的顏色不能改變顏色,因為每根燈管中的氣體只會因其固有的物理特性而發(fā)出
    的頭像 發(fā)表于 08-27 17:29 ?2.4w次閱讀
    <b class='flag-5'>霓虹燈</b>的制作教程