1. 程式人生 > >LED寫成字元裝置並加入核心的方法

LED寫成字元裝置並加入核心的方法

問題描述
  1. 寫一個模組,讓他開機自動載入
  2. 在第一步的程式碼裡面新增程式碼,讓LED2在系統啟動的時候閃爍10s
  3. 在第二步的程式碼裡面新增字元驅動的框架,再將編譯好的模組新增到ARM板上,讓其在系統啟動的時候執行。
  4. 繼續修改第三步的程式碼,使其能自動在dev目錄下建立裝置節點,可以使用例如”Echo "1" >/dev/led“來控制LED。
  5. 將第四步的程式碼新增到核心中,使其可以通過make menuconfig將其配置進核心
對於第一個問題,我選擇使用修改rc.local來使模組開機自動載入。我的模組名和位置是這樣的:
/user/led_lan/led.ko(位置無關,大家可以任意放)
首先進入rc.local檔案:
#vim /ect/rc.d/rc.local
在開頭新增如下兩行:
/sbin/insmod  /user/led_lan/led.ko
mknod /dev/cled c  2000 0
然後儲存退出。
對於led的驅動編寫,我們按照字元模組的格式對其進行編寫,這樣就可以實現用 echo "1" > /dev/cled來控制led了。同時建立核心執行緒使其在開機時閃爍10秒。
程式碼如下:

/*
 * Copyright (c) 2009-~ Lan Peng
 *
 * This source code is released for free distribution under the terms of the
 * GNU General Public License
 *
 * Author: Lan Peng<

[email protected]>
 * Created Time: 2009年09月23日 星期三 17時11分37秒
 * File Name: led.c
 *
 * Description:
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/device.h>
#include <linux/
cdev.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <asm/uaccess.h>

#define GPO_5_SET (*(volatile unsigned int __force *)0xf4028004)
#define GPO_5_CLR (*(volatile unsigned int __force *)0xf4028008)
#define GPO_5 (1<<5)
#define
DEV_NAME     "cdevled"
#define IO_SET 1
#define IO_CLR 0
#define LED_MAJOR    2000

static int lan_led_open(struct inode *inode, struct file *file);
static int lan_led_release(struct inode *inode, struct file *file);
static ssize_t lan_led_write(struct file *file, const char __user *buff, ssize_t count, loff_t *ppos);
static ssize_t lan_led_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);

static struct file_operations lan_led_fops = {
    .owner = THIS_MODULE,
    .write = lan_led_write,
    .ioctl     = lan_led_ioctl,
    .open = lan_led_open,
    .release = lan_led_release,
};
static int lan_led_open(struct inode *inode, struct file *file)
{
    printk("Open......\n");
    try_module_get(THIS_MODULE);
    GPO_5_SET |= GPO_5;
    return 0;
}

static int lan_led_release(struct inode *inode, struct file *file)
{
    printk("Release......\n");
    module_put(THIS_MODULE);
    return 0;
}

static ssize_t lan_led_write(struct file *file, const char __user *buff, ssize_t count, loff_t *ppos)
{
    char ctrl;
    get_user(ctrl, (unsigned char *)buff);
    if(ctrl == '0')
        GPO_5_CLR |= GPO_5;
    else if(ctrl == '1')
        GPO_5_SET |= GPO_5;
    return count;
}

static ssize_t lan_led_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
    return 0;
}

static int led_start(void *p)
{
    char i;
    p = p;
    for(i = 0; i < 10; i++){
        GPO_5_CLR |= GPO_5;
        mdelay(500);
        GPO_5_SET |= GPO_5;
        mdelay(500);
    }
    return 0;
}
static int __init led_init(void)
{
    int ret;
    printk("Hello, led cdev!\n");
    ret = register_chrdev(LED_MAJOR, DEV_NAME, &lan_led_fops);
    if(ret < 0){
        printk("Cannot register led\n");
        return ret;
    }
    kernel_thread(led_start, NULL, CLONE_KERNEL);
    return 0;
}

static void __exit led_exit(void)
{
    printk("Bye bye...\n");
    unregister_chrdev(LED_MAJOR, DEV_NAME);
}

module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("LAN");


將此模組make後放到上面的目錄中,然後重啟即可看到led閃爍10秒。
最後一個問題是將模組編譯進核心,這個問題在我的部落格已經有了,這裡不再講述。


閱讀(317) | 評論(0) | 轉發(0) | 給主人留下些什麼吧!~~ 評論熱議

相關推薦

LED字元裝置加入核心方法

問題描述寫一個模組,讓他開機自動載入在第一步的程式碼裡面新增程式碼,讓LED2在系統啟動的時候閃爍10s在第二步的程式碼裡面新增字元驅動的框架,再將編譯好的模組新增到ARM板上,讓其在系統啟動的時候執行。繼續修改第三步的程式碼,使其能自動在dev目錄下建立裝置節點,可以使用例

linux命令sh指令碼執行

unrar.sh指令碼編寫為: 該指令碼功能是轉到/home目錄下,將/1.rar壓縮包解壓到當前資料夾/home下(123456為解壓密碼) #!/bin/sh cd /home unrar e -p123456 "/1.rar" 將unrar.sh指令

從零開始linux字元裝置驅動程式(一)(基於友善之臂tiny4412開發板)

從這篇博文開始,我將開始手把手教會大家寫linux裝置驅動程式這是開篇,如何來寫第一個字元裝置驅動程式。首先,寫一個最簡單的字元裝置驅動程式需要什麼?或者說我們需要了解什麼?1、每一個字元裝置至少需要有一個裝置號2、裝置號 = 主裝置號 + 次裝置號3、同一類裝置的主裝置號一

查集一個類

col truct pac 並查集 cst clas div main amp 這個應該不用多說。。 1 #include <cstdio> 2 using namespace std; 3 4 const int maxn=10005; 5 in

Python爬蟲小實踐:尋找失蹤人口,爬取失蹤兒童信息csv文件,方便存入數據庫

python tor enc mini 執行 gem view 獲取 但是 前兩天有人私信我,讓我爬這個網站,http://bbs.baobeihuijia.com/forum-191-1.html上的失蹤兒童信息,準備根據失蹤兒童的失蹤時的地理位置來更好的尋找失蹤兒童,這

字元裝置核心抽象

Linux核心中處處體現面向物件的設計思想,為了統一形形色色的裝置,Linux系統將裝置分為三類:字元裝置、塊裝置、網路裝置。並將其分別抽象為struct cdev,struct block_device,struct net_devce三個物件,具體的裝置都可以包含著三種物件從而繼承和

python2/3中 將base64資料圖片,將圖片資料轉為16進位制資料的方法、bytes/string的區別

1.python2將base64資料寫成圖片,並將資料轉為16進位制字串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABEAABERABEiABEzACIAACIRACIiACIzADMAADMRADMiADMzADd3

Linux字元裝置驅動註冊三種方法以及核心分析

       Linux驅動是使用者訪問底層硬體的橋樑,驅動有可以簡單分成三類:字元裝置、塊裝置、網路裝置。其中最多的是字元裝置,其中字元裝置的註冊方法主要有三種:雜項設備註冊、早期字元設備註冊、標準字元設備註冊。以及詳細介紹各類方法註冊。 開發環境: PC:WMwork

Java將list資料取出加入分隔符拼接,轉換String

方法一: public String listToString(List list, char separator) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.size(); i++

字元裝置驅動----LED驅動程式

一. 概念介紹 一般使用者在應用程式裡呼叫的 open, read, write 函式是 c 庫的函式, 這些函式會觸發 swi val異常,從而引發系統呼叫,進入到核心空間, 核心通過VFS(virtual Filesystem)來實現呼叫不同的驅動函式

linux裝置驅動第三篇:一個簡單的字元裝置驅動

在linux裝置驅動第一篇:裝置驅動程式簡介中簡單介紹了字元驅動,本篇簡單介紹如何寫一個簡單的字元裝置驅動。本篇借鑑LDD中的原始碼,實現一個與硬體裝置無關的字元裝置驅動,僅僅操作從核心中分配的一些記憶體。 下面就開始學習如何寫一個簡單的字元裝置驅動。首先我們來分解一下字元

3---linux字元裝置之點亮led

概要:上一篇我們編寫了一個非常簡單的字元裝置框架和一個我們自己寫的fops,似乎還是感覺有點索然無味,因此這篇我們搞一個能在現實世界上出現的東西,就是led亮起來 上一篇我們寫了一個字元裝置的框架,因此我們可以拿過來用:2—linux字元裝置進階篇 1.檢視2440原理圖,隨便找一個

FL2440字元裝置驅動之LED

今天開始我們來學習linux驅動的開發,驅動分為字元裝置驅動,塊裝置,網路裝置驅動,講這個之前我說一下我用的虛擬機器版本和LInux核心版本,開始我用的redhat 9.0  開始用的好好的,到後來自己編譯busybox的時候總是出錯誤,這個期間我嘗試了很多次,在網上也找到

Linux 字元裝置驅動開發--記憶體讀操作

學習Linux的累計時間已經有兩年多了,工作關係,學習的過程總是斷斷續續的,現在整理一下,下面要分享的是一個簡單的linux驅動程式,將記憶體當作一個虛擬的裝置去讀寫,沒有什麼實際的用處,像hello wold!程式一樣,我們簡單體會一下linux驅動程式的特點,Linux

基於樹莓派Raspberry: 字元裝置核心驅動程式框架編寫

        之前寫了一篇移植2.4寸TFT驅動到樹莓派的文章,那篇博文中的驅動程式碼是國外大牛寫的,看了一下,還是有很多地方沒理解,是得好好再學習一下核心驅動的編寫,這裡就從字元裝置驅動開始,採用最簡單的LED驅動來建立核心驅動移植的驅動框架.        個人原創,

字元裝置驅動控制led

開發板:龍芯1B PC:ubuntu13.10 本程式為字元裝置驅動,提供控制led燈功能,如要實現控制需要自己寫應用程式,開啟驅動檔案就可控制led燈,led燈通過gpio控制 #include <linux/init.h> #include <lin

linux核心驅動 TI OMAP類處理器的LED所涉及到裝置樹彙整

樣例擷取自linux4.1.13中,與裝置樹有關BeagleBone Black 的部分程式碼,1、 定位GPIO控制器在處理的外圍地址: GPIO0 記憶體對映: GPIO1 記憶體對映: GPIO2、GPIO3 記憶體對映: 2、CONTROL_MODULE控

字元裝置的讀

在應用程式看來,字元裝置只是一個裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。應用層對裝置的操作都在裝置驅動程式的file_operations結構中有對應的介面,比如應用層的read函式對應驅動層的file_operations-> read,而應用

linux0.11字元裝置的讀過程分析

首先要知道linux系統/dev目錄下的各種裝置檔案(檔案屬性c打頭)並不佔用空間,你可以發現他們的大小為0位元組,他們的區別在於檔案的i節點的成員i_zone[0]的值不同,該值標識不同的裝置號。比如tty0檔案的裝置號為0x0400,tty1裝置號為0x0401,hd0

Linux核心模組程式設計-字元裝置驅動

裝置驅動簡介 裝置被大概的分為兩類: 字元裝置和塊裝置。 字元裝置 提供連續的資料流,應用程式可以順序讀取,通常不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,鍵盤、串列埠、調變解調器都是典型的字元裝置。 塊裝置 應用程式可以隨機