1. 程式人生 > >樹莓派linux驅動學習之LED控制

樹莓派linux驅動學習之LED控制

#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.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 <asm/io.h>
#include <asm/uaccess.h>
#include <linux/ioport.h>

#include "bcm2835.h"

// Blinks on RPi Plug P1 pin 11 (which is GPIO pin 17)
#define PIN RPI_GPIO_P1_11

int open_state = 0;         //檔案開啟狀態

static int leds_open(struct inode *inode, struct file *filp)
{
    if(open_state == 0)  
    {  
        open_state =  1;  
        printk("Open file suc!\n");  
        return 0;  
    }  
    else  
    {  
        printk("The file has opened!\n");  
        return -1;  
    }  
}

static int leds_ioctl(struct file*filp, unsigned int cmd, unsigned long arg)
{
    switch(cmd)  
    {  
        case 0:  
            bcm2835_gpio_clr(PIN);
            printk("LED OFF!\n");
            break;  
        case 1:  
            bcm2835_gpio_set(PIN);
            printk("LED ON!\n");
            break;  

        default:  
            return-EINVAL;  
    }  

    return 0;
}

static int leds_release(struct inode *inode, struct file *filp)
{
    if(open_state == 1)  
    {  
        open_state =  0;  
        printk("close file suc!\n");  
        return 0;  
    }  
    else  
    {  
        printk("The file has closed!\n");  
        return -1;  
    }  
}

static const struct file_operations leds_fops = {
    .owner = THIS_MODULE,
    .open = leds_open,
    .unlocked_ioctl = leds_ioctl,
    .release = leds_release,
};

static struct miscdevice misc = {
    .minor =MISC_DYNAMIC_MINOR,
    .name ="my_leds",
    .fops =&leds_fops,
};


static int __init leds_init(void)
{
    int ret;

    //註冊混雜裝置
    ret =misc_register(&misc);

    //配置功能選擇暫存器為輸出
    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);

    //設定輸出電平為高電平,LED亮
    bcm2835_gpio_set(PIN);

    printk("ledsinit.\n");
    return ret;
}

static void leds_exit(void)
{
    //LED滅
    bcm2835_gpio_clr(PIN);

    misc_deregister(&misc);        

    printk("leds_exit\n");
}

module_init(leds_init);
module_exit(leds_exit);

MODULE_AUTHOR("Hu Chunxu");
MODULE_LICENSE("GPL");
    硬體相關操作:

相關推薦

樹莓linux驅動學習LED控制

#include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <linux/kernel.h> #include <linux/module.h&g

嵌入式Linux驅動學習USART串列埠控制:基於AT91SAM9261EK

    普通微控制器的串列埠操作比較容易,但是基於Linux系統的串列埠操作難不難呢?其實,基於Linux作業系統的串列埠操作分為兩個部分:串列埠驅動部分(底層驅動與設備註冊)與串列埠的應用程式(使用者程式)。一般廠家或是Linux核心已經提供了基於開發板的串列埠驅動,只需

嵌入式Linux驅動學習引導篇——為什麼要選擇嵌入式Linux驅動這個方向?

      醞釀了幾分鐘,依舊不知道如何開篇(這可能是工科男的一個通病吧)。索性隨意起來,想到哪寫到哪,這樣也許思維能變得更加活躍呢。      先交代一下背景,本人目前是國內某普通一本高校的一名大三學生,讀的專業是電氣工程及其自動化。轉程式猿也是目前大多數跨專業就業學生的首

linux驅動學習ioctl介面

   這裡先用例子介紹一下ioctrl介面的使用, 應用層的ioctl函式傳入的cmd和arg引數會直接傳入驅動層的ioctl介面,ioctl介面的命令有一定規範詳細檢視ioctl-number.txt檔案,這裡命令的定義不在規範內,先看下面測試的例子,驅動只實現ioctr

linux學習程序控制

首先交代幾個基本概念 1.程式:程式是一個儲存在磁碟上某個目錄中的可執行檔案 2.程序:程式的執行例項被稱為程序 3.程序ID:每個程序都有一個非負整數型表示的唯一程序ID 除了程序ID,每個程序還有一些其他識別符號,下面是相關函式 #include<un

arduino學習led相關--跑馬燈+電位器控制led亮滅

引子 一直挺喜歡搞點硬體的東西,可是每次都堅持不了多久。不過人總是要尋找寫改變的,之前未能堅持下去的不代表現在以及將來不能堅持下去,於是開始新的一波學習之旅。 開始 之前本來入了一塊開發板(51和微控制器都有),最近重拾微控制器,順帶入了一塊ardui

linux驅動開發6驅動框架led

1.何謂驅動框架 1.1驅動是誰寫的 1)驅動開發工程師 2)核心維護者 1.2驅動程式設計協作要求 1)介面標準化 2)儘量降低驅動開發者難度 1.3到底什麼是驅動框架 1)核心中驅動部分維護者針對每個種類的驅動設計一套成熟的、標準的、典型的驅動實現,然後把

用shell來控制樹莓上鍊接的LED

如果GPIO25上依然連著LED,並亮著,我們可以寫一個off.sh 的指令碼 來吧LED熄滅。 指令碼如下: #!/bin/bash echo Setting pin low echo 0>

Linux樹莓b+)學習~putty遠端登入

硬體條件:樹莓派b+主機板,8G sd卡,網線,滑鼠+鍵盤,LCD微雪7寸顯示器,膝上型電腦,電源線 軟體工具:Putty 想要用Putty遠端登入樹莓派不是那麼複雜,由於沒有無線網絡卡本文使用LCD顯示器手動配置靜態ip後通過網線直連膝上型電腦網絡卡,不能達到遠端登入x-

學習Linux C程式設計程序控制程式設計

建立程序 fork fork 的定義 在 Linux 中,我們使用 fork 來建立一個子程序 fork 的返回值 fork 函式有些特殊,成功它返回 2 次,失敗返回 -1,利用這個特性可以判斷當前的程序是子程序還是父程序:  1. 在子程序中返回 0  2.

樹莓真的適合學習Linux系統嗎?

樹莓派是一種便宜的卡片式Linux電腦,風靡全球。它是世界上眾多廉價又成熟的電腦之一,只要35美元,而且十分容易上手。 樹莓派能替代日常桌面計算機的多種用途,包括文書處理、電子表格、媒體中心甚至是遊戲。類似於樹莓派的卡片式電腦還有好多,比如說:香蕉派,橘子派,cubieb

linux驅動編寫中斷處理

類型 div 應該 urn 處理方式 com pre turn 申請 一、中斷 1、概念 學過單片機的應該非常清楚中斷的概念,也就是CPU在正常執行程序過程中,出現了突發事件(中斷事件),於是CPU暫停當前程序的執行,轉去處理突發事件。處理完畢後,CPU又返回被

linux驅動開發蜂鳴器驅動源碼分析(一)

linux 蜂鳴器 驅動 蜂鳴器的驅動源碼在/driver/char/buzzer/x210-buzzer.c文件中,源碼如下#include <linux/module.h> #include <linux/kernel.h> #include <linux

Linux系統學習Ln(軟連接和硬鏈接)

director 連接 鏈接 然而 符號連接 硬鏈接 信息 oinstall 不同 可簡單理解為,軟連接:創建的軟連接文件是源文件的快捷方式,刪除創建的軟連接文件,源文件不受影響,連接消失。 硬鏈接:兩個連體的文件,修改其中一個文件,另外一個文件也會隨之更改;刪除其中一個文

linux驅動開發framebuffer應用編程實踐(一)

linux驅動開發之framebuffer驅動 1、framebuffer應用編程 (1)打開設備文件 (2)獲取設備信息 宏定義的命令在/linux/fb.h中 不可變信息FSCREENINFO,使用ioctl參數有FBIOGET_FSCREENINFO宏名,表示用ioctl從

驅動學習gpiolib的建立過程

linux驅動 gpiolib1:gpiolib的學習重點(1)gpiolib的建立過程:gpiolib和虛擬地址映射類似,也是需要一個建立過程的,因此在學習的時候,我們需要明白gpiolib是什麽時候建立的,建立函數在哪被調用的。(2)gpiolib的使用方法:申請、使用、釋放(3)gpiolib的架構:涉

樹莓3b驅動dht11溫濕度傳感器

ros tran tex his std auto div color success 新建並打開C文件 touch dht11.c sudo vim dht11.c 編寫驅動程序 1 #include<wiringPi.h> 2 #i

Linux命令學習—每天發一個命令—mkdir

linux 命令 mkdirLinux命令學習之—每天發一個命令—mkdirmkdir 命令用來創建指定的名稱的目錄,要求創建目錄的用戶在當前目錄中具有寫權限,並且指定的目錄名不能是當前目錄中已有的目錄。1.命令格式:mkdir [選項] 目錄...2.命令功能:通過 mkdir 命令可以實現在指定位置創建以

linux驅動系列程序反匯編

.html 動態庫 log end 作用 文件 二進制文件 調試 可執行文件 摘抄網頁:http://www.169it.com/article/330129798173630299.html 參考網頁:http://www.cppblog.com/liu1061/art

樹莓小車(三)Python控制小車

gpio 小車 沒有 物體 凹凸 img str 接口 表示 正文之前 由於最近忙於復習趕考,所以暫時沒有拿起樹莓派小車,直到昨天,終於空出時間來把代碼整理一下來和大家分享。 正文 在樹莓派小車系列之二中,講到了樹莓派的引腳定義方式有兩種: PHYSICAL NU