嵌 入 式 系 統 實 驗 報 告 指導教師:
學科專業:
班
級:
學
號:
姓
名:
2014 年 6 月
前
言 從20世紀七十年代單片機的出現到各式各樣的嵌入式微處理器,微控制器的大規模應用,嵌入式系統已經有了近 30 年的發展歷史,并在全世界各行業得到廣泛應用。嵌入式系統產品的研制與應用已經成為我國信息化帶動工業化、工業化促進信息化發展的新的國民經濟增長點。經過幾十年的發展,嵌入式系統已經在很大程度改變了人們的生活、工作與娛樂方式,而且這些改變還在加速。嵌入式系統具有無數的種類,每類都具有自己獨特的個性。例如,MP3、數碼相機與打印機就有很大的不同。汽車中更就是具有多個嵌入式系統,使汽車更輕快、更干凈、更容易駕駛,機頂盒、高清電視、游戲機、智能玩具、交換機、路由器、數控設備或儀表、汽車電子、家電控制系統、醫療儀器、航天航空設備等等,都就是典型的嵌入式系統。事實上,幾乎所有帶有一點“智能”的家電(全自動洗衣機、電腦電飯煲…)都就是嵌入式系統。嵌入式系統廣泛的適應能力與多樣性,使得視聽、工作場所甚至健身設備中到處都有嵌入式系統。
高端的嵌入式系統與工業軟件的發展, 實際上與我們對該行業最先進的科學技術前沿的掌握有關,換言之,與我國該行業的科學技術水平有關。學習與研究嵌入式系統,具有重大意義。
這學期的嵌入式系統的學習過程中我們在2410RP這一實驗開發平臺上進行了諸多嵌入式的基礎實驗。在本報告中,將把其中兩個具有代表性的實驗的原理、內容、結果以及驅動與測試程序寫出來。
目
錄 實驗一
數碼管顯示 ....................................................................................................................... 1 1、1 實驗目的 ......................................................................................................................... 1 1、2 實驗內容 ......................................................................................................................... 1 1、3 實驗原理 ......................................................................................................................... 1 1、3、1
LED 的發光原理 ............................................................................................ 1 1、3、2 八段 LED 顯示器 ............................................................................................. 1 1、3、3 芯片 zlg7289A 的介紹 ..................................................................................... 2 1、3、4 數碼管的連接電路 ........................................................................................... 3 1、4 實驗步驟 ......................................................................................................................... 3 1、5 實驗源代碼解釋與說明 ................................................................................................. 3 1、6 總結 ............................................................................................................................... 10 實驗二
LED 點陣驅動實驗 ........................................................................................................ 11 2、1 實驗目的 ....................................................................................................................... 11 2、2 實驗內容 ....................................................................................................................... 11 2、3 實驗原理 ....................................................................................................................... 11 2、3、1
8X8 點陣數碼管發光原理 ........................................................................... 11 2、3、2 數碼管的連接電路 ......................................................................................... 11 2、3、3
I/O 接口 ........................................................................................................ 12 2、4 實驗步驟 ....................................................................................................................... 12 2、5 實驗源代碼解釋與說明 ............................................................................................... 13 2、6 實驗結果 ....................................................................................................................... 17 2、7 總結 ............................................................................................................................... 17
實驗一
數碼管顯示 1、1 實驗目的 學習串并轉換的相關知識,并編寫驅動程序。
1、2 實驗內容 1)了解數碼管顯示的工作原理; 2)掌握數碼管驅動的編寫及測試過程; 3)對 zlg7289A 的驅動程序進行編寫; 4)驅動數碼管并顯示個人學號。
1、3 實驗原理 1、3、1
LED 的發光原理 LED(Light Emitting Diode),即發光二極管。就是一種半導體固體發光器件。它就是利用固體半導體置于一個有引線的架子上,然后四周用環氧樹脂密封,起到保護內部芯線的作用,所以 LED 的抗震性能好。
發光二極管的核心部分就是由 p 型半導體與 n 型半導體組成的晶片,如圖所示,在 p 型半導體與 n 型半導體之間有一個過渡層,稱為 p-n 結。在某些半導體材料的 PN 結中,注入的少數載流子與多數載流子復合時會把多余的能量以光的形式釋放出來,從而把電能直接轉換為光能。PN 結加反向電壓,少數載流子難以注入,故不發光。這種利用注入式電致發光原理制作的二極管叫發光二極管,通稱 LED。當它處于正向工作狀態時(即兩端加上正向電壓),電流從 LED 陽極流向陰極時,半導體晶體就發出從紫外到紅外不同顏色的光線,光的強弱與電流有關。
圖 1-1 LED 發光原理圖 1、3、2 八段 LED 顯示器 八段 LED 顯示器由 8 個發光二極管組成,如圖 1-2、圖 1-3 所示。基中 7 個長條形的發光管排列成“日”字形,另一個賀點形的發光管在顯示器的右下角作為
顯示小數點用,它能顯示各種數字及部份英文字母。LED 顯示器有兩種不同的形式:一種就是 8 個發光二極管的陽極都連在一起的,稱之為共陽極 LED 顯示器;另一種就是 8 個發光二極管的陰極都連在一起的,稱之為共陰極 LED 顯示器。
共陰與共陽結構的 LED 顯示器各筆劃段名與安排位置就是相同的。當二極管導通時,相應的筆劃段發亮,由發亮的筆劃段組合而顯示的各種字符。8 個筆劃段 hgfedcba 對應于一個字節(8 位)的 D7 D6 D5 D4 D3 D2 D1 D0,于就是用 8位二進制碼就可以表示欲顯示字符的字形代碼。例如,對于共陰 LED 顯示器,當共陰極接地(為零電平),而陽極hgfedcba各段為0111011時,顯示器顯示"P"字符,即對于共陰極 LED 顯示器,“P”字符的字形碼就是 73H。如果就是共陽 LED 顯示器,共陽極接高電平,顯示“P”字符的字形代碼應為 10001100(8CH)。這里必須注意的就是:很多產品為方便接線,常不按規則的方法去對應字段與位的關系,這時字形碼就必須根據接線來自行設計了。
圖1-2
LED數碼管組成圖
圖1-3
LED數碼管原理圖
1、3、3 芯片 zlg7289A 的介紹 zlg7289A 就是一片具有串行接口的可同時驅動 8 位共陰式數碼管或 64 只獨立 LED 的智能顯示驅動芯片該芯片同時還可連接多達 64 鍵的鍵盤矩陣單片即可完成 LED 顯示﹑鍵盤接口的全部功能。zlg7289A 內部含有譯碼器可直接接受BCD碼或16進制碼并同時具有2 種譯碼方式參瞧后文此外還具有多種控制指令如消隱﹑閃爍﹑左移﹑右移﹑段尋址等 zlg7289A 具有片選信號可方便地實現多于 8 位的顯示或多于 64 鍵的鍵盤接口。
芯片 zlg7289A 的典型應用:儀器儀表、工業控制器、條形顯示器、控制面板。
芯片 zlg7289A 的特點:
1)串行接口無需外圍元件可直接驅動 LED;
2)各位獨立控制譯碼/不譯碼及消隱與閃爍屬性; 3))循環左移/
循環右移指令; 4)具有段尋址指令方便控制獨立 LED;
5)64 鍵鍵盤控制器內含去抖動電路。
1、3、4 數碼管的連接電路
圖1-4 數碼管連接電路
1、4 實驗步驟 1)連接號宿主 PC 機與一臺 S3C2410-RP 目標板; 2)編寫數碼管驅動程序 spi_led、c 文件; 3)啟動系統終端設置 S3C2410-RP 目標板的地址; 4)將宿主 PC 機的根目錄掛載到 S3C2410-RP 目標板的 mnt 目錄下; 5)加載驅動程序; 6)執行并測試程序。
1、5 實驗源代碼解釋與說明
A、 頭文件 keypad、h
#ifndef __KEYPAD_H__ #define __KEYPAD_H__ //Keypad 掃描碼 #define KEYPADNUMLK
0x33 #define KEYPADDIV
0x34 #define KEYPADMUL
0x35 #define KEYPADSUB
0x3d #define KEYPADADD
0x2e #define KEYPADENTER
0x1e #define KEYPADDOT
0x15
//DEL #define KEYPAD0
0x14
//INS #define KEYPAD1
0x1b
//END #define KEYPAD2
0x1c
//DOWN #define KEYPAD3
0x1d
//PDN #define KEYPAD4
0x23
//LEFT #define KEYPAD5
0x24
#define KEYPAD6
0x25
//RIGHT #define KEYPAD7
0x2b
//HOME #define KEYPAD8
0x2c
//UP #define KEYPAD9
0x2d
//PUP #endif
頭文件定義了嵌入式開發板上輸入鍵盤各個按鍵的邏輯地址。
B、 驅動程序源文件 spi_led、c #include <linux/config、h>
//config、h 內核配置頭文件 #include <linux/kernel、h>
// kernel、h 定義了經常用到的函數原型及宏定義
#include <linux/module、h>
// module、h 定義了內核模塊相關的函數、變量及宏
#include <linux/sched、h>
//sched、h 為調度程序頭文件,定義了任務結構 #include <linux/interrupt、h>
//interrupt、h 中包含了與操作系統中斷相關的大部分宏及 struct 結構的定義
#include <linux/timer、h> #include <linux/init、h>
// init、h 中定義了驅動的初始化與退出相關的函數
#include <linux/delay、h>
#include <linux/modversions、h> #include <linux/version、h>
//version、h 里定義了 Linux 內核的版本,用于版本檢查 #include <asm/io、h>
//I/O 頭文件,定義對 I/O 端口操作的函數 #include <asm/irq、h> #include <asm/hardware、h>
//訪問系統硬件的頭文件 //------------------------------------------------------------------------------ #include <linux/config、h>
#include <linux/spinlock、h>
//自旋鎖,防止多處理器并發 #include <linux/interrupt、h> #include <linux/tty、h> #include <linux/mm、h> #include <linux/signal、h> #include <linux/kbd_ll、h> #include <linux/random、h> #include <linux/poll、h> #include <linux/miscdevice、h>
//miscdevice 結構體成員變量設備 #include <linux/slab、h> #include <linux/kbd_kern、h> #include <linux/vt_kern、h> #include <linux/smp_lock、h> #include <linux/kd、h> #include <linux/pm、h> #include <asm/bitops、h> #include <asm/uaccess、h>
//包 含 copy_to_user、copy_from_user 等內核訪問用戶進程內存地址的函數定義
#include <asm/system、h>
//系統頭文件,定義了設置或修改描述符/中斷門等的嵌入式匯編宏 //------------------------------------------------------------------------------ #define HR_DEBUG 1 //------------------------------------------------------------------------------ #define IRQ_spi_led_INT
IRQ_EINT4 #define GPIO_SimpleINT_EINT4
(GPIO_MODE_ALT0 | GPIO_PULLUP_EN | GPIO_F4) #define ONEBIT
0x1 #define KEYPADCSDIS
(GPGDAT |=(ONEBIT << 3)) #define KEYPADCSEN
(GPGDAT &=~(ONEBIT << 3)) #define KEYPADDIRMO
(GPBDAT &=~(ONEBIT << 0)) #define KEYPADDIRMI
(GPBDAT |=(ONEBIT << 0)) #define spi_led_MAJOR
104
//定義 led_ary_MAJOR 設備的主設備號 devfs_handle_t
spi_led_handle;
//系統支持 devfs 的數據結構 int spi_led_temp_count=0;
//定義的系統全局變量,防止文件被多重打開 static int DELAY_TIME=100;
//時間延遲為 100
int
putcToKBCTL(u8 c) {
u32
i;
KEYPADCSEN;
KEYPADDIRMO;
udelay(60);
while((SPSTA1 & ONEBIT)==0);
// wait while busy
SPTDAT1 = c;
// write left justified data
while((SPSTA1 & ONEBIT)==0);
// wait while busy
KEYPADCSDIS;
i = SPRDAT1;
return(i); }
//功能概要:將所給數據寫入指定的寄存器中 int spi_ledInit() {
int
t;
char dummy = (char)0xff;
printk("GPGCON=%x\n",GPGCON);
GPGCON &= ~((0x3<<6)|(0x3<10)|(0x3<<12)|(0x3<<14));
GPGCON |= ((0x1<<6)|(0x3<10)|(0x3<<12)|(0x3<<14));
printk("GPGCON=%x\n",GPGCON);
KEYPADCSDIS;
// 設置為高電平
// setup Dir signal (KEYBOARD)
CPU->7289
GPBCON &= ~(0x3 << 0);
// 清除 GPB0 端口數據
GPBCON |= (ONEBIT << 0);
//設置端口 GPB0 用于_PWR_OK 信號輸出
// rGPDDAT &=~(ONEBIT << 0);
// 將 _PWR_OK t 置 0
KEYPADDIRMO;
//設置 SPI(串行外設接口)寄存器
// 中斷模式,可用分頻,主模式,高電平時鐘,形式 B,正常模式
//rSPCON1=(ONEBIT<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(ONEBIT<<1); // 查詢模式,可用分頻,主模式,高電平時鐘,形式 A,正常模式
SPCON1 = (0<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(0<<1); /* 開發者必須根據 PCLK 時鐘的變化正確地調節分頻器的值*/ SPPRE1 = 255;
/* 99、121K = 203M/4/2/(255+1) PCLK=50、75Mhz
FCLK=203Mhz SPICLK=99、121Khz*/
putcToKBCTL(0xbf);
//傳送初始化指令
printk("Key Pad Init complete:\n");
//顯示鍵盤初始化成功
putcToKBCTL(0xc8);
//第一個數碼管的地址為 0xc8
putcToKBCTL(0x01);
//設置第一個數碼管顯示的數值為 1
KEYPADCSDIS;
putcToKBCTL(0xc9);
//第二個數碼管的地址為 0xc9
putcToKBCTL(0x02);
//設置第二個數碼管顯示的數值為 2
KEYPADCSDIS;
putcToKBCTL(0xca);
//第三個數碼管的地址為 0xca
putcToKBCTL(0x09);
//設置第三個數碼管顯示的數值為 9
KEYPADCSDIS;
putcToKBCTL(0xcb);
//第三個數碼管的地址為 0xcb
putcToKBCTL(0x00);
//設置第三個數碼管顯示的數值為 0
KEYPADCSDIS;
return(1); } //函數實現 LED 數碼管的初始化,返回值為 1 時,則完成系統初始化 u8 readKBValue(void) {
unsigned char i;
KEYPADCSEN;
KEYPADDIRMO;
udelay(60);
while((SPSTA1 & ONEBIT)==0);
// wait while busy
SPTDAT1 = 0x15;
// 傳送讀取鍵值的命令
while((SPSTA1 & ONEBIT)==0);
// wait while busy
udelay(30);//delay 30us
KEYPADDIRMI;
SPTDAT1 = 0xff;
// 傳送讀取鍵值的命令
while((SPSTA1 & ONEBIT)==0);
// wait while busy
i = SPRDAT1;
// printk("%x\n",i);
KEYPADCSDIS;
KEYPADDIRMO;
return(i); }
//函數實現的主要功能為讀取鍵盤輸入的值。
ssize_t spi_led_read (struct file *
* buf, size_t count, loff_t * f_ops) {
return count; }
//函數返回:讀取數據的長度 count。
//功能概要:對字符性設備進行讀操作 /*=========== SimpleD
Write =======================*/ ssize_t spi_led_write (struct file *
char * buf, size_t count, loff_t * f_ops) {
printk("s3c2410: device
operation!\n");
return count; } //函數返回:寫入數據的長度 count。
//功能概要:對字符性設備進行寫入操作 /*=========== SimpleD Ioctl =======================*/ ssize_t spi_led_ioctl (struct inode * inode ,struct file * file,
unsigned int cmd, long data) {
printk("s3c2410: device ioctl operation!\n");
} //函數可重新定義用來 I/O 口的其她控制操作 /*============ SimpleD device open ==============*/
ssize_t spi_led_open (struct inode * inode ,struct file * file) {
return 0; } //當用戶態調用函數時,對應內核態次函數被調用 /*============ SimpleD device close =============*/ ssize_t spi_led_release (struct inode
* inode ,struct file * file) {
return 0; }//定義內核態 release 函數,當用戶態調用 close 函數時,release 函數被調用 struct
spi_led_ops ={
open:
spi_led_open,
read:
spi_led_read,
write:
spi_led_write,
ioctl:
spi_led_ioctl,
release: spi_led_release, }; // 結構體在頭文件 linux/fs、h 中定義,用來存儲驅動內核模塊提供的對設備進行各種操作的函數的指針
static void IRQ_spi_led_interrupt(int nr, void *devid, struct pt_regs *regs) {
u8
ui8ScanCode;
ui8ScanCode=readKBValue();
//HR_del_pre_scancode(ui8ScanCode); }
//定義靜態函數 IRQ_spi_led_interrupt,請求中斷 static int __init HW_spi_led_init(void) {
int ret = -ENODEV;
int delay ;
set_external_irq(IRQ_spi_led_INT,EXT_FALLING_EDGE, GPIO_PULLUP_EN);
set_gpio_ctrl(GPIO_SimpleINT_EINT4);
ret = request_irq(IRQ_spi_led_INT, IRQ_spi_led_interrupt, SA_INTERRUPT,
"spi_led", NULL);
if (ret) {
printk(KERN_INFO "request SimpleINT IRQ failed (%d)\n", IRQ_spi_led_INT);
return ret;
}
ret = devfs_register_chrdev(spi_led_MAJOR, "spi_led", &spi_led_ops);
if( ret < 0 ){
printk (" s3c2410: init_module failed with %d\n", ret);
return ret;
}
else
{
printk(KERN_INFO" S3c2410 spi_led register success!!!\n");
;
}
spi_led_handle = devfs_register( NULL, "spi_led", DEVFS_FL_DEFAULT,
spi_led_MAJOR, 0, S_IFCHR, &spi_led_ops, NULL); //-------------------------------------------------------------------
spi_ledInit(); //-------------------------------------------------------------------
return ret; }
//用于驅動程序進行硬件設備初始化 int __init s3c2410_spi_led_init(void) {
int
ret = -ENODEV;
ret = HW_spi_led_init();
if (ret)
return ret;
return 0; }
//模塊初始化,程序由此開始執行,此函數被 module_init()調用 int init_module() {
s3c2410_spi_led_init(); }
//此函數在 insmod 加載此模塊驅動的時候自動調用。負責進行設備驅動程序初始化工作、init_module 返回 0 以表示初始化成功。返回負數表示失敗。
void cleanup_module() {
devfs_unregister_chrdev( spi_led_MAJOR, "spi_led" );
devfs_unregister( spi_led_handle );
free_irq(IRQ_spi_led_INT, NULL); }
// 此函數在卸載此模塊驅動時調用。負責進行設備驅動程序的清除工作 1、6 總結
通過本次實驗,我學習到一些Linux系統常用的操作命令,了解了LED數碼管工作的原理。同時,對嵌入式系統有了更明確的了解與認識。通過實驗中的實際操作,也體驗了基于嵌入式開發的基本流程。在老師的指導下,完成了對 LED 數碼管的顯示控制,顯示得到了自己學號的后四位 1290。
實驗二
LED 點陣驅動實驗 2、1 實驗目的 編寫一個針對總線操作的硬件驅動程序。
2、2 實驗內容 1)了解 LED 點陣顯數碼管示的工作原理; 2)掌握 LED 點陣驅動的編寫及測試; 3)編寫一個針對硬件 LED 點陣的驅動程序并測試; 4)驅動 LED 點陣并顯示個人姓名。
2、3 實驗原理 2、3、1
8X8 點陣數碼管發光原理 從圖 2-1 中可以瞧出來,8X8 點陣共需要 64 個發光二極管組成,且每個發光二極管就是放置在行線與列線的交叉點上,當對應的某一列置 1 電平,某一行置 0 電平,則相應的二極管就亮;因此要實現一根柱形的亮法,如圖 2-1 所示,對應的一列為一根豎柱,或者對應的一列為一根橫柱,因此實現柱形的亮法如下所述:
圖 2-1 LED 點陣等效電路圖 2、3、2 數碼管的連接電路
系統電路如圖 2-2 所示。顯示部分用的就是一個 8X8 發光二極管點陣,我們常見的用于發布消息、顯示漢字的點陣式 LED 顯示屏通常由若干塊 LED 點陣顯示模塊組成,8X8 顯示點陣模塊,每塊有 64 個獨立的發光二極管,為了減少引腳且便于封裝,各種 LED 顯示點陣模塊都采用陣列形式排布,即在行列線的交點處接有顯示 LED。(因此,LED 點陣顯示模塊的顯示驅動只能采用動態驅動方式,每次最多只能點亮一行 LED(共陽形式 LED 顯示點陣模塊)或一列 LED(共陰形式
LED 顯示點陣模塊)。如圖 2-2 所示的顯示驅動原理圖中,點陣為共陰,由總線鎖存芯片 74573 為點陣顯示模塊提供列驅動電流,8 個行信號則由集電極開路門驅動器 7407 控制,行線與列線都掛在總線上,微處理器可以通過總線操作來完成對每一個 LED 點陣顯示模塊內每個 LED 顯示點的亮、暗控制。
圖 2-2
LED 點陣硬件連接電路 2、3、3
I/O 接口 在本開發板上,整個 LED 顯示模塊就是作為一個 I/O 進行控制的。如電路原理圖 2-2 所示,DATA[0、、7]、DATA[8、、15]分別對應系統數據線的低 16位,LED_LOCK信號就是由系統總線的寫信號與地址信號經簡單的邏輯組合而得,在板載的 CPLD 內完成,控制該顯示模塊的 I/O 地址為 0x08000000。
2、4 實驗步驟 1)連接號宿主 PC 機與一臺 S3C2410-RP 目標板; 2)編寫 LED 點陣驅動程序; 3)編寫 LED 點陣顯示測試程序 test、c,并編譯; 4)啟動 Linux 系統終端并設置 S3C2410-RP 目標板的地址;
5)將宿主 PC 機的根目錄掛載到 S3C2410-RP 目標板的 mnt 目錄下; 6)加載 LED 點陣驅動程序; 7)執行并測試程序。
2、5 實驗源代碼解釋與說明
A、驅動程序源文件led_ary、c #include <linux/config、h>
//config、h 為內核配置頭文件,文件里面指向另一個由 make menuconfig 自動生成的文件 autoconf、h #include <linux/kernel、h>
// kernel、h 定義了經常用到的函數原型及宏定義
#include <linux/module、h>
//module、h 模塊驅動程序的頭文件,定義了內核模塊相關的函數、變量及宏 #include <linux/sched、h>
//sched、h 為調度程序頭文件,定義了任務結構 #include <linux/interrupt、h> //interrupt、h 中包含了與操作系統中斷相關的大部分宏及 struct 結構的定義
#include <linux/timer、h> #include <linux/init、h>
// init、h 中定義了驅動的初始化與退出相關的函數
#include <linux/delay、h> /* for udelay */ #include <linux/modversions、h> #include <linux/version、h>
//定義了 Linux 內核的版本,用于版本檢查 #include <asm/io、h>
//I/O 頭文件,定義對 I/O 端口操作的函數 #include <asm/irq、h> #include <asm/hardware、h>
//訪問系統硬件用的頭文件 #include <asm/uaccess、h> #define led_ary_MAJOR 102
//定義了 led_ary_MAJOR 設備的主設備號為 102 #define VERSION
"2410RP-led_ary-V1、00-070820" unsigned long ioremap_addr; void showversion(void) {printk("*********************************************\n");
printk("\t %s \t\n", VERSION);
printk("*********************************************\n\n"); }
//函數用于顯示該設備的版本型號 devfs_handle_t
dev_handle;
//系統支持 devfs 的數據結構,注冊 handle 到存
儲設備上。
int led_ary_temp_count=0;
//定義的系統變量,防止文件被多重打開。
ssize_t led_ary_read (struct file *
* buf, size_t count, loff_t * f_ops) {char tmp[1];
printk("s3c2410: device
operation!\n");
tmp[0]=inb(ioremap_addr);
copy_to_user(buf,tmp,1);
return count; }
//函數實現對字符型設備進行讀取操作 ssize_t led_ary_write (struct file *
char * buf, size_t count, loff_t * f_ops) {outw(count,ioremap_addr);
printk("s3c2410: device write operation!\n");
return count; } //函數實現對字符性設備進行寫操作 //上述兩個函數實現了用戶空間與內核空間的數據交換,而且還可以檢查用戶空間指針的有效性 //ioctl()函數,可實現讀寫之外的控制。
ssize_t led_ary_ioctl (struct inode * inode ,struct file * file,
unsigned int cmd, long data) {printk("s3c2410: device ioctl operation!\n");
}
//函數可重新定義用于實現 I/O 口的其她控制操作 ssize_t led_ary_open (struct inode * inode ,struct file * file) {return 0; } //當用戶態調用 open 函數時,對應內核態次函數被調用 ssize_t led_ary_release (struct inode
* inode ,struct file * file) {return 0; }
//當用戶態調用 close 函數時,此 release 函數被調用。
struct
led_ary_ops ={
open:
led_ary_open,
read:
led_ary_read,
write:
led_ary_write,
ioctl:
led_ary_ioctl,
release: led_ary_release, };
// 結構體在頭文件 linux/fs、h 中定義,用來存儲驅動內核模塊提供的對設備進行各種操作的函數的指針, 指出設備驅動程序所提供的入口點位置 static int __init HW_led_ary_init(void) { int ret = -ENODEV;
showversion();
ret = devfs_register_chrdev(led_ary_MAJOR, "led_ary", &led_ary_ops);
/*字符設備 led_ary 進行注冊*/
if( ret < 0 ){
printk (" s3c2410: init_module failed with %d\n", ret);
return ret;
}
else
{printk(KERN_INFO" S3c2410 led_ary register success!!!\n");
;
}
dev_handle = devfs_register( NULL, "led_ary", DEVFS_FL_DEFAULT,
led_ary_MAJOR, 0, S_IFCHR, &led_ary_ops, NULL);/*
注冊 devfs 設備*/
printk("GPACON=%x\n",GPACON);
printk("BWSCON=%x\n",BWSCON);
ioremap_addr=ioremap(0x18000002,0x0f);/* 將一個 IO 地址空間映射到內核的虛擬地址空間上去*/
outw(0x00ff,ioremap_addr);/*從 I/O 讀取數據*/
return ret; }
//函數用于驅動程序進行硬件設備初始化 int __init s3c2410_led_ary_init(void) {
int
ret = -ENODEV;
ret = HW_led_ary_init();
if (ret)
return ret;
return 0;
}
//模塊初始化,程序由此開始執行,此函數被 module_init()調用。
int init_module() {
s3c2410_led_ary_init(); }
//insmod 在加載此模塊的時候自動調用該函數,負責進行設備驅動程序初始化工作、init_module 返回 0 以表示初始化成功。返回負數表示失敗。
void cleanup_module() {devfs_unregister_chrdev( led_ary_MAJOR, "led_ary" );/*字符設備解除注冊*/
devfs_unregister( dev_handle ); }
//在模塊被卸載時調用該函數。負責進行設備驅動程序的清除工作。
B、 LED點陣顯示設置程序文件test、c: include<stdio、h>
//標準I/O庫 #include<sys/ioctl、h>
#include<fcntl、h>//文件控制,用于文件及其描述符的操作控制常數符號的定義 #include<unistd、h>
//unix類系統定義符號常量的頭文件 #include <stdlib、h>
//該頭文件定義了實用程序庫函數 #include <sys/types、h>
//基本系統數據類型頭文件 #include <sys/stat、h>
//文件狀態 int main()
//主程序入口 {int fd
;
int i,ret;
int buf;
fd=open("/dev/led_ary",O_RDWR);
//獲取LED點陣驅動程序加載情況
if (fd<0)
{
//fd為0,則表示設備驅動正常開啟
printf("Open device SimpleD error\n");}
else
{ //fd為1,則設備驅動已經開啟
printf("Open device SimpleD success\n");} for(;;)//向LED點陣進行賦值,控制發光二極管的亮滅,最終實現在點陣中顯示出“王”字
{
buf=0Xfe3e;
//向點陣第一行進行賦值(點陣中低位在前、高位在后) write(fd,&buf,buf); buf=0Xfd08;
//向點陣第二行進行賦值 write(fd,&buf,buf); buf=0Xfb08; write(fd,&buf,buf); buf=0Xf73e; write(fd,&buf,buf); buf=0Xef08;
write(fd,&buf,buf); buf=0Xdf08;
write(fd,&buf,buf); buf=0Xbf7f; write(fd,&buf,buf); buf=0X7f00; write(fd,&buf,buf); }
return 0; } 2、6 實驗結果
2、7 總結
通過本次實驗,我學習到了LED點陣的工作原理,了解到了LED點陣其各點邏輯地址的分布。同時,對嵌入式系統有了更明確的認識。通過實驗中的實際操作,也了解了基于嵌入式開發的基本流程。在老師的指導下,完成了對LED點陣的顯示控制,顯示得到了自己的姓“王”。
推薦訪問: 嵌入式系統 原理 實驗上一篇:旅游規劃收費標準
在偉大祖國73華誕之際,我參加了單位組織的“光影鑄魂”主題黨日活動,集中觀看了抗美援朝題材影片《長津湖》,再一次重溫這段悲壯歷史,再一次深刻感悟偉大抗美援朝精神。1950年10月,新中國剛剛成立一年,
根據省局黨組《關于舉辦習近平談治國理政(第四卷)讀書班的通知》要求,我中心通過專題學習、專題研討以及交流分享等形式,系統的對《習近平談治國理政》(第四卷)進行了深入的學習與交流,下面我就來談一談我個人
《習近平談治國理政》(第四卷)是在百年變局和世紀疫情相互疊加的大背景下,對以習近平同志為核心的黨中央治國理政重大戰略部署、重大理論創造、重大思想引領的系統呈現。它生動記錄了新一代黨中央領導集體統籌兩個
《真抓實干做好新發展階段“三農工作”》是《習近平談治國理政》第四卷中的文章,這是習近平總書記在2020年12月28日中央農村工作會議上的集體學習時的講話。文章指出,我常講,領導干部要胸懷黨和國家工作大
在《習近平談治國理政》第四卷中,習近平總書記強調,江山就是人民,人民就是江山,打江山、守江山,守的是人民的心。從嘉興南湖中駛出的小小紅船,到世界上最大的執政黨,在中國共產黨的字典里,“人民”一詞從來都
黨的十八大以來,習近平總書記以馬克思主義戰略家的博大胸襟和深謀遠慮,在治國理政和推動全球治理中牢固樹立戰略意識,在不同場合多次圍繞戰略策略的重要性,戰略和策略的關系,提高戰略思維、堅定戰略自信、強化戰
《習近平談治國理政》第四卷集中展示了以習近平同志為核心的黨中央在百年變局和世紀疫情相互疊加背景下,如何更好地堅持和發展中國特色社會主義而進行的生動實踐與理論探索;對于新時代堅持和發展什么樣的中國特色社
在黨組織的關懷下,我有幸參加了區委組織部組織的入黨積極分子培訓班。為期一周的學習,學習形式多樣,課程內容豐富,各位專家的講解細致精彩,對于我加深對黨的創新理論的認識、對黨的歷史的深入了解、對中共黨員的
《習近平談治國理政》第四卷《共建網上美好精神家園》一文中指出:網絡玩命是新形勢下社會文明的重要內容,是建設網絡強國的重要領域。截至2021年12月,我國網民規模達10 32億,較2020年12月增長4
剛剛召開的中國共產黨第十九屆中央委員會第七次全體會議上討論并通過了黨的十九屆中央委員會向中國共產黨第二十次全國代表大會的報告、黨的十九屆中央紀律檢查委員會向中國共產黨第二十次全國代表大會的工作報告和《