mini6410—-led驅動學習

來源:互聯網
上載者:User

LED是開發中最常用的狀態指示裝置,本開發板具有4個使用者可程式化LED,它們直接與CPU的GPIO相串連,低電平有效(點亮),詳細的硬體串連如下表:

mini6410開發板上用到的4個LED的硬體資源如:

       要操作所用到的IO口,就要設定它們所用到的寄存器,需要調用一些現成的函數或者宏,在此用到的是readl和writel,它們將直接對相應的寄存器執行讀取和寫入的操作。在下面的驅動程式清單中,你可以看到它們被調用的情況。除此之外,還需要調用一些和裝置驅動密切相關的基本函數,如註冊裝置misc_register,填寫驅動函數結構file_operations,以及module_init和module_exit函數等。

      在這裡,四個LED是採用的GPKCON寄存器上的4組4bit位來配置對應引腳的用途。見下面:

        而GPKDAT寄存器用來對應4個LED的數值狀態,GPKDAT4就對應GPK4,以此類推。當GPIO輸出低電平led有效,就是說當GPKDAT寄存器【15:0】相應位設定為0時,GPK4,5,6,7將輸出低電平,對應的LED就發光。友善給6410的LED驅動代碼如下:

#include <linux/miscdevice.h>#include <linux/delay.h>#include <asm/irq.h>//#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/mm.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/delay.h>#include <linux/moduleparam.h>#include <linux/slab.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/string.h>#include <linux/list.h>#include <linux/pci.h>#include <asm/uaccess.h>#include <asm/atomic.h>#include <asm/unistd.h>#include <mach/map.h>#include <mach/regs-clock.h>#include <mach/regs-gpio.h>#include <plat/gpio-cfg.h>#include <mach/gpio-bank-e.h>#include <mach/gpio-bank-k.h>#define DEVICE_NAME "leds" //裝置名稱(/dev/leds)/*ioctl函數的實現,在應用、使用者層將通過ioctl函數向核心傳遞參數,以控制led的狀態,函數參數為:裝置標識符;led控制命令(開啟或關閉);第幾個led*/static long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){switch(cmd) {unsigned tmp;case 0:case 1:if (arg > 4) {return -EINVAL;}tmp = readl(S3C64XX_GPKDAT); //讀出S3C64XX_GPKDAT寄存器tmp &= ~(1 << (4 + arg));  tmp |= ( (!cmd) << (4 + arg) );writel(tmp, S3C64XX_GPKDAT); //設定S3C64XX_GPKDAT寄存器 //printk (DEVICE_NAME": %d %d\n", arg, cmd);return 0;default:return -EINVAL;}}static struct file_operations dev_fops = { //檔案操作裝置結構體,因為本LED驅動在下面已經註冊為misc裝置,因此可以不用open、colse等.owner= THIS_MODULE,.unlocked_ioctl= sbc2440_leds_ioctl, //linux2.36.6之後去掉了ioctl,但是應用程式還是用ioctl,核心會自動處理};/*將LED驅動註冊為MISC裝置*/static struct miscdevice misc = {.minor = MISC_DYNAMIC_MINOR,//動態次裝置號,混雜裝置主裝置號為10,如此設定後,次裝置號會動態分配。.name = DEVICE_NAME, // 裝置名稱.fops = &dev_fops,};static int __init dev_init(void)  //裝置初始化{int ret;{unsigned tmp;tmp = readl(S3C64XX_GPKCON); //將四個LED連接埠寄存器設定為輸出tmp = (tmp & ~(0xffffU<<16))|(0x1111U<<16);writel(tmp, S3C64XX_GPKCON);tmp = readl(S3C64XX_GPKDAT); //設定四個led連接埠寄存器設定為高電平輸出,在模組載入後,四個LED不發光tmp |= (0xF << 4);writel(tmp, S3C64XX_GPKDAT);}ret = misc_register(&misc); // 註冊混雜裝置,驅動載入後會在/dev目錄自動產生裝置檔案/dev/DEVICE_NAME(混雜裝置的一個特點,主裝置號為10,次裝置號自動動態分配)printk (DEVICE_NAME"\tinitialized\n");列印初始化資訊return ret;}static void __exit dev_exit(void) {misc_deregister(&misc);}module_init(dev_init);//模組初始化module_exit(dev_exit);//卸載模組MODULE_LICENSE("GPL");//著作權資訊MODULE_AUTHOR("FriendlyARM Inc.");//開發人員資訊

 說明:雜項裝置(misc device)
雜項裝置也是在嵌入式系統中用得比較多的一種裝置驅動。在 Linux 核心的include/linux 目錄下有miscdevice.h 檔案,要把自己定義的misc device 從裝置定義在這裡。其
實是因為這些字元裝置不符合預先確定的字元裝置範疇,所有這些裝置採用主裝置號10,一起歸於misc device,其實misc_register 就是用主裝置號10 調用register_chrdev()的。也就是說,misc裝置其實也就是特殊的字元裝置

        接下來,添加LED裝置的核心配置選項,開啟drivers/char/Kconfig檔案,添加如下內容:

config MINI6410_LEDStristate "LED Support for Mini6410 GPIO LEDs"depends on MACH_MINI6410default y if MACH_MINI6410helpThis option enables support for LEDs connected to GPIO lineson Mini6410 boards.

       接下來,再根據該驅動的配置定義,把對應的驅動目標檔案加入核心中,開啟linux-2.6.38/drivers/char/Makefile 檔案,添加如下內容:

obj-$(CONFIG_MINI6410_LEDS) += mini6410_leds.o

這樣就在核心中添加做好了LED驅動。然後配置並編譯核心。測試程式mini641_leds如下:

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>int main(int argc, char **argv){int on;int led_no;int fd;/* 檢查led控制的兩個參數,如果沒有參數輸入則退出。*/if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||on < 0 || on > 1 || led_no < 0 || led_no > 3) {fprintf(stderr, "Usage: leds led_no 0|1\n");exit(1);}/*開啟/dev/leds裝置檔案*/fd = open("/dev/leds0", 0);if (fd < 0) {fd = open("/dev/leds", 0);}if (fd < 0) {perror("open device leds");exit(1);}/*通過系統調用ioctl和輸入的參數控制led*/ioctl(fd, on, led_no);/*關閉裝置控制代碼*/close(fd);return 0;}

在PC機上編譯此程式

arm-linux-gcc  mni6410_leds.c -o mini6410_leds

將其拷貝到開發板測試即可。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.