一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

開(kāi)發(fā)板試用精選 ? 來(lái)源:開(kāi)發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-12-05 11:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文來(lái)源電子發(fā)燒友社區(qū),作者:jf_00240724, 帖子地址:https://bbs.elecfans.com/jishu_2284706_1_1.html

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

第一章 重寫(xiě)驅(qū)動(dòng)
一.1. 知識(shí)儲(chǔ)備
一.1.1. 卸載驅(qū)動(dòng)
一.1.1.1. linux加載/卸載驅(qū)動(dòng)有兩種方法


一.1.1.1.1. modprobe

這里我們主要用這個(gè)。

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

載入模塊的命令:

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

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

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

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

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

選項(xiàng)

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

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

-d或--debug:使用排錯(cuò)模式;

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

-r或--remove:模塊閑置不用時(shí),即自動(dòng)卸載模塊;

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

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

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

-help:顯示幫助。

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


實(shí)例

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

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

alias symbol:ip_conntrack_unregister_notifier ip_conntrack

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

這里,我們能查看到我們所需要的模塊,然后根據(jù)我們的需要來(lái)掛載;其實(shí)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 模塊名來(lái)掛載一個(gè)模塊。掛載之后,用lsmod可以查看已經(jīng)掛載的模塊。模塊名是不能帶有后綴的,我們通過(guò)modprobe -l所看到的模塊,都是帶有.ko或.o后綴。

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

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

一.1.1.1.2. rmmod

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

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

一.1.2.0.1. 地址映射

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

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

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

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

1 u8 readb(constvolatilevoid __iomem *addr)

2 u16 readw(constvolatilevoid __iomem *addr)

3 u32 readl(constvolatilevoid __iomem *addr)

>

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

二、寫(xiě)操作函數(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這三個(gè)函數(shù)分別對(duì)應(yīng)8bit、16bit和32bit寫(xiě)操作,參數(shù)value是要寫(xiě)入的數(shù)值,addr是要寫(xiě)入的地址。

接下來(lái)我們開(kāi)始搭建一個(gè)linux驅(qū)動(dòng)框架:
<

#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ū)動(dòng)入口函數(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è)備注冊(cè)失敗 */

}

return 0;
}

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

static void __exit led_exit(void)

{

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

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

unregister_chrdev(200,"chrdev");

}

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

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

module_init(led_init);

module_exit(led_exit);

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

MODULE_LICENSE("GPL");

>

這只是一個(gè)驅(qū)動(dòng)框架沒(méi)有實(shí)際內(nèi)容。

一.2. 硬件準(zhǔn)備

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

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

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. 軟件-實(shí)操

一.3.1. 驅(qū)動(dòng)卸載

基于以上的知識(shí)儲(chǔ)備,本來(lái)想嘗試一下卸載得掉leds這個(gè)驅(qū)動(dòng)?但最終發(fā)現(xiàn)不是我們以上準(zhǔn)備的驅(qū)動(dòng)框架,而是sysfs的驅(qū)動(dòng)框架,稍微研究一下,發(fā)現(xiàn)有點(diǎn)難度,值得針對(duì)性的再寫(xiě)一篇。

在此我們就不去卸載了。

一.3.2. 驅(qū)動(dòng)編寫(xiě)

等研究好了sysfs驅(qū)動(dòng)框架后,再實(shí)操一遍iic驅(qū)動(dòng)編寫(xiě)。

第二章 應(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. 看效果:
請(qǐng)觀看底部視頻



霓虹燈效果

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

    關(guān)注

    242

    文章

    23847

    瀏覽量

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

    關(guān)注

    0

    文章

    48

    瀏覽量

    17143
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5682

    瀏覽量

    104832
  • PHYTEC
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    3804
  • 開(kāi)發(fā)板試用

    關(guān)注

    3

    文章

    302

    瀏覽量

    2407
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    PHYTEC開(kāi)發(fā)板試用體驗(yàn)】1 實(shí)現(xiàn)個(gè)霓虹燈_Part A

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

    家用小型霓虹燈電路圖

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

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

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

    PHYTEC開(kāi)發(fā)板試用體驗(yàn)】1 實(shí)現(xiàn)個(gè)霓虹燈_Part A

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

    PHYTEC開(kāi)發(fā)板試用體驗(yàn)】2 實(shí)現(xiàn)個(gè)霓虹燈_Part-B

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

    PHYTEC開(kāi)發(fā)板試用體驗(yàn)】3 通過(guò)開(kāi)發(fā)板張照片

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

    霓虹燈程序員指南

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

    霓虹燈電源電路

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

    霓虹燈的工作原理

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

    實(shí)用霓虹燈電源電路

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

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

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

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

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

    簡(jiǎn)易霓虹燈驅(qū)動(dòng)電路

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

    霓虹燈

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

    霓虹燈的制作教程

     我通常討厭RGB LED,盡可能堅(jiān)持使用暖白色。但是“俗氣”的顏色確實(shí)讓人覺(jué)得這是個(gè)霓虹燈。 (當(dāng)然霓虹燈的顏色不能改變顏色,因?yàn)槊扛鶡艄苤械臍怏w只會(huì)因其固有的物理特性而發(fā)出
    的頭像 發(fā)表于 08-27 17:29 ?2.4w次閱讀
    <b class='flag-5'>霓虹燈</b>的制作教程