91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

3天內不再提示

【PHYTEC開發板試用體驗】2 實現一個酷炫霓虹燈_Part-B

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

掃碼添加小助手

加入工程師交流群

本文來源電子發燒友社區,作者:jf_00240724, 帖子地址:https://bbs.elecfans.com/jishu_2284706_1_1.html

今天我們接上一篇繼續,需要做兩個事情。第一個是重寫驅動,第二個是開發霓虹燈應用程序。

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


一.1.1.1.1. modprobe

這里我們主要用這個。

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

載入模塊的命令:

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

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

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

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

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

選項

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

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

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

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

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

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

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

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

-help:顯示幫助。

參數 模塊名:要加載或移除的模塊名稱。


實例

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

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

alias symbol:ip_conntrack_unregister_notifier ip_conntrack

列出內核中所有已經或者未掛載的所有模塊:modprobe -l

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

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

掛載vfat模塊:modprobe vfat

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

移除已經加載的模塊:modprobe -r 模塊名

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

一.1.1.1.2. rmmod

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

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

一.1.2.0.1. 地址映射

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

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

一.1.2.0.2. linux內存訪問函數

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

1 u8 readb(constvolatilevoid __iomem *addr)

2 u16 readw(constvolatilevoid __iomem *addr)

3 u32 readl(constvolatilevoid __iomem *addr)

>

readb、readw和readl這三個函數分別對應8bit、16bit和32bit讀操作,參數addr就是要讀取寫內存地址,返回值就是讀取到的數據。

二、寫操作函數

<

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

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

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

>

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

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

#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,

};

/* 驅動入口函數 */

static int __init led_init(void)

{

/* 入口函數具體內容 */

int retvalue = 0;

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

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

if(retvalue < 0){

/* 字符設備注冊失敗 */

}

return 0;
}

/* 驅動出口函數 */

static void __exit led_exit(void)

{

/* 出口函數具體內容 */

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

unregister_chrdev(200,"chrdev");

}

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

/* 將上面兩個函數指定為驅動的入口和出口函數 */

module_init(led_init);

module_exit(led_exit);

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

MODULE_LICENSE("GPL");

>

這只是一個驅動框架沒有實際內容。

一.2. 硬件準備

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

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

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. 驅動卸載

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

在此我們就不去卸載了。

一.3.2. 驅動編寫

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

第二章 應用程序

二.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. 看效果:
請觀看底部視頻



霓虹燈效果

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

    關注

    242

    文章

    23843

    瀏覽量

    674009
  • 霓虹燈
    +關注

    關注

    0

    文章

    48

    瀏覽量

    17139
  • 開發板
    +關注

    關注

    25

    文章

    5680

    瀏覽量

    104674
  • PHYTEC
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3803
  • 開發板試用
    +關注

    關注

    3

    文章

    302

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    PHYTEC開發板試用體驗】1 實現霓虹燈_Part A

    節我們將會對板子進行上電,并做一個簡單的實驗,那就是實現
    的頭像 發表于 12-05 11:14 ?1441次閱讀
    【<b class='flag-5'>PHYTEC</b><b class='flag-5'>開發板</b><b class='flag-5'>試用</b>體驗】1 <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'>霓虹燈</b>_<b class='flag-5'>Part</b> A

    家用小型霓虹燈電路圖

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

    基于labview 實現霓虹燈

    基于labview 實現霓虹燈字體,流動閃爍效果!
    發表于 04-24 14:35

    PHYTEC開發板試用體驗】1 實現霓虹燈_Part A

    節我們介紹的開箱環節,這節我們將會對板子進行上電,并做一個簡單的實驗,那就是實現
    發表于 05-28 11:50

    PHYTEC開發板試用體驗】2 實現霓虹燈_Part-B

    今天我們接上篇繼續,需要做兩事情。第一個是重寫驅動,第二開發霓虹燈應用程序。第
    發表于 06-05 11:40

    PHYTEC開發板試用體驗】3 通過開發板張照片

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

    霓虹燈程序員指南

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

    霓虹燈電源電路

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

    霓虹燈的工作原理

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

    實用霓虹燈電源電路

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

    熒光霓虹燈的區別

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

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

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

    簡易霓虹燈驅動電路

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

    霓虹燈

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

    霓虹燈的制作教程

     我通常討厭RGB LED,盡可能堅持使用暖白色。但是“俗氣”的顏色確實讓人覺得這是霓虹燈。 (當然霓虹燈的顏色不能改變顏色,因為每根燈管中的氣體只會因其固有的物理特性而發出
    的頭像 發表于 08-27 17:29 ?2.4w次閱讀
    <b class='flag-5'>霓虹燈</b>的制作教程
    主站蜘蛛池模板: 手机看片1024在线 | 加勒比一木道|视频在线看 加勒比在线免费视频 | a级午夜毛片免费一区二区 a看片 | 免费看va | 亚洲韩国在线一卡二卡 | 色内内免费视频播放 | 三级视频欧美 | 国产婷婷色一区二区三区深爱网 | 嘿嘿嘿视频在线观看网站 | 国产成人精品一区二区三区 | 精品国产成人系列 | 青娱乐99| 天堂网| 天堂资源wwww在线看 | 色香蕉色香蕉在线视频 | yy4080一级毛片免费观看 | 亚洲国产精品综合久久网络 | 亚欧色视频在线观看免费 | 91国内在线观看 | 国产成人a一区二区 | 三级视频网站在线观看播放 | 91av在线免费观看 | 五月综合在线 | 成人在线天堂 | 人人澡人人添 | 91大神精品视频 | 性欧美欧美之巨大69 | 狠狠狠狠干| 亚洲天堂免费观看 | 老色批| 六月婷婷导航福利在线 | 全部在线播放免费毛片 | 精品免费久久久久久成人影院 | 午夜久久久久久 | 欧美黄色片在线播放 | 加勒比啪啪| 男人和女人做爽爽视频在线观看 | 国产精品天天看天天爽 | 美女扒开尿口给男人看的让 | 久久男人的天堂色偷偷 | 91精品国产91久久久久久青草 |