Linux裝置驅動之《點亮一盞LED》

2021-05-22 20:15:28 字數 1484 閱讀 3494

如果玩過微控制器那麼對於arm控制gpio來說應該不會很陌生,上手比較容易,對於硬體的操作無非就是高低電平和暫存器的操作,所以對於arm也是一樣的。這裡簡單的介紹乙個控制開發板上led的簡單例子,對於硬體操作能有一定的基礎概念和操作方法。

全部程式的實現在三個檔案中,標頭檔案ioctl_c.h,c檔案是驅動層test.c和應用層main.c

首先是標頭檔案,該檔案主要定義了為gpio操作的結構體和裝置控制操作是的型別

_iow() ,_iowr() 詳解參見超連結中。

然後是驅動層程式test.c

在函式

中多了一行 .ioctl=ioctl_test, 他就是應用層中ioctl函式的底層呼叫。

那麼就繼續看ioctl_test函式

這裡有函式copy_from_user(),這是乙個很常用很重要的函式,該函式主要作用就是將使用者空間的資料複製到核心空間 。這裡實際上是把應用層上的結構體複製到核心中。這裡為什麼這樣在後面描述。

然後根據函式引數cmd作判斷,分別判斷傳入核心空間的是gpio_io_set_gpg還是gpio_io_get_gpg。

switch(cmd)

緊接著到led_ctl()函式中分析

這裡牽扯到了硬體操作,先看一下底板硬體電路圖。是gpg5和gpg6兩個腳。

宣告乙個結構體 gpio_data_s led;

所以結構中我們賦值 led.port=='g'&& led.bit==5 && led.value==0 和 led.port=='g' && led.bit==6 && led.value==0

然後對硬體寫資料,寫硬體呼叫函式 __raw_writel()

__raw_writel(0x400,s3c2410_gpgcon);

__raw_writel(0xffdf,s3c2410_gpgdat);

這裡為什麼要些這個資料,我們要看一下s3c2440的資料手冊

如圖0x400的二進位制數是0000010000000000,這裡的gpg5給01,說明是output,這個值賦給gpgcon暫存器中,這樣才能點亮led。

而    0xffdf  的二進位制則是1111111111011111,gpgdat的描述中說:當埠配置為輸出,引腳狀態和相應的位一樣。這裡0的意思就是第5位給低電平,由電路圖知道引腳給0值led亮。

gpg6同理!!

驅動層**就分析到這裡,後面是應用層程式設計。main.c

函式說明:這裡的#include "../ioctl_c.h"是標頭檔案位置,可以根據情況自行修改。

led_ctl.port='g';

led_ctl.bit=5;

led_ctl.value=0;

ioctl(testdev,gpio_io_set_gpg,&led_ctl);

就實現gpg5的led亮。

最後執行編譯,make ,交叉編譯main.c。

生成test.ko和main

試驗證明:led可以點亮! ^_^

2 點亮第一盞LED燈

對微控制器的控制,其實就是對i 0口的控制。15系列微控制器最多有p0 p7八個8位雙向輸入輸出埠 p5除外 比賽所用的iap15f2k61s2僅用到p0 p4五組i 0口。注 新增.c檔案到工程中,否則程式設計不能通過。對keil的幾項設定 標頭檔案中stc15f2k60s2.h中已包含了位定義 ...

夥伴故事 一盞智慧型燈,點亮家庭和工業照明的新未來

摘要 從家居到工業場景,點亮一盞智慧型燈帶來的不僅僅是光亮,資料在流轉之間,改變了我們的生活,也推動了整個城市的智慧型化建設。點亮一盞燈,乙個簡單的開關控制即可,這是傳統的照明場景。在ai iot技術快速發展的當下,亮燈這個動作有了無限的想象空間和可能性,承載著諸如安全 舒適和健康等更高層次的需求,...

STM32學習筆記1 點亮第一盞LED燈

本文不特殊說明都以stc32f103c8為例,軟體平台為keil5v5.15 首先這次我們用暫存器直接點亮led燈 led電路圖如下圖 可以看出如果需要點亮一盞led燈只需要io口輸出高電平即可,本次以gpiob為例子。點亮led燈 控制io輸出高電平通常需要三步 1.開啟時鐘 因為stm32為了節...