娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

led_dev.c源碼:

#include "linux/module.h"

#include "linux/moduleparam.h"

#include "linux/ioport.h"

#include "linux/init.h"

#include "linux/delay.h"

#include "linux/platform_device.h"

// 1. 分配一個platform_device 

// 2. 設置 

static struct resource led_resoures[] = {

    [0] = {

        .start  = 0x7F008820,  // GPMCON 

        .end    = 0x7F008827,

        .flags  = IORESOURCE_MEM,

    },

    [1] = {

        .start  = 1,

        .end    = 1,

        .flags  = IORESOURCE_IRQ,

    },

};

static void led_release(struct device *dev)

{

}

static struct platform_device led_dev = {

    .name           = "up6410_led",

    .id             = 0,

    .num_resources  = 2,

    .resource       = led_resoures,

    .dev            = {

            .release = led_release,

    },

};

// 3. 注冊 

static int led_dev_init(void)

{

    platform_device_register(&led_dev);

    return 0;

}

static void led_dev_exit(void)

{

    platform_device_del(&led_dev);

}

module_init(led_dev_init);

module_exit(led_dev_exit);

MODULE_LICENSE("GPL");

=====================================================================

led_drv.c源碼:

#include "linux/module.h"

#include "linux/compat.h"

#include "linux/types.h"

#include "linux/errno.h"

#include "linux/smp_lock.h"

#include "linux/kernel.h"

#include "linux/major.h"

#include "linux/slab.h"

#include "linux/mm.h"

#include "linux/mman.h"

#include "linux/vt.h"

#include "linux/init.h"

#include "linux/linux_logo.h"

#include "linux/proc_fs.h"

#include "linux/seq_file.h"

#include "linux/console.h"

#include "linux/kmod.h"

#include "linux/err.h"

#include "linux/device.h"

#include "asm/uaccess.h"

#include "asm/io.h"

#include "linux/platform_device.h"

static int major  = 0;

static volatile unsigned long *gpxcon;

static volatile unsigned long *gpxdat;

static int pin;

static struct class *cls;

static int led_open(struct inode *inode, struct file *file)

{

    *gpxcon &= ~(0xf << (pin * 4));

    *gpxcon |= (0x1 << (pin * 4));

    return 0;

}

static ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)

{

    char val;

    copy_from_user(&val, buf, 1);

    if (val == 0)

    {

        // 開燈 

        *gpxdat &= ~(1<

    }

    else

    {

        *gpxdat |= (1<

    }

    return 1;    

}

static struct file_operations led_fops = {

    .owner    = THIS_MODULE,

    .open     = led_open,

    .write    = led_write,

};

static int led_probe(struct platform_device *dev)

{

    struct resource *res;

    res = platform_get_resource(dev, IORESOURCE_MEM, 0);

    gpxcon = ioremap(res->start, res->end - res->start + 1);

    gpxdat = gpxcon + 1;

    res = platform_get_resource(dev, IORESOURCE_IRQ, 0);

    pin = res->start;

    

    major = register_chrdev(0, "led", &led_fops);

    cls = class_create(THIS_MODULE, "led"); // sysfs 

    device_create(cls, NULL, MKDEV(major, 0), NULL, "led");

    return 0;

}

static int led_remove(struct platform_device *dev)

{

    device_destroy(cls, MKDEV(major, 0));

    class_destroy(cls);

    unregister_chrdev(major, "led");

    iounmap(gpxcon);

    return 0;

}

// 1. 分配一個platform_driver 

// 2. 設置 

static struct platform_driver led_drv = {

    .probe       = led_probe,

    .remove      = __devexit_p(led_remove),

    .driver      = {

        .name    = "up6410_led",

        .owner   = THIS_MODULE,

    },

};

// 3. 注冊 

static int led_drv_init(void)

{

    platform_driver_register(&led_drv);

    return 0;

}

static void led_drv_exit(void)

{

    platform_driver_unregister(&led_drv);

}

module_init(led_drv_init);

module_exit(led_drv_exit);

MODULE_LICENSE("GPL");

=====================================================================

led_test.c源碼:

#include "sys/types.h"

#include "sys/stat.h"

#include "fcntl.h"

#include "sys/mman.h"

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

void print_usage(char *file)

{

    printf("Usage:\n");

    printf("%s \n", file);

}

int main(int argc, char **argv)

{

    int fd;

    char val;

    

    if (argc != 2)

    {

        print_usage(argv[0]);

        return -1;

    }

    fd = open("/dev/led", O_RDWR);

    if (fd < 0)

    {

        printf("can't open /dev/led\n");

        return -1;

    }

    if (strcmp(argv[1], "on") == 0)

    {

        val = 0;

    }

    else

    {

        val = 1;

    }

    write(fd, &val, 1);

    return 0;

}

====================================================================

Makefile文件:

KERN_DIR = /home/linux/linux-3.0.1

all:

    make -C $(KERN_DIR) M=`pwd` modules 

clean:

    make -C $(KERN_DIR) M=`pwd` modules clean

    rm -rf modules.order

obj-m += led_drv.o

obj-m += led_dev.o

====================================================================

編譯驅動程序:make

編譯應用程序:arm-linux-gcc led_test led_test.c


關鍵字:OK6410  分層分離  總線  驅動  設備模型 引用地址:OK6410分層分離(總線-驅動-設備模型)

上一篇:OK6410之USB設備驅動程序
下一篇:OK6410觸摸屏驅動

推薦閱讀

? ?根據日媒《產經新聞》指出,因受到中美貿易戰影響,美國財政部為保護自家企業的尖端技術,將透過美國海外投資委員會(簡稱CFIUS,為審查關于美國國家安全的外國對美投資,有無安全上的疑慮。),針對半導體、通信業等27個領域的外資企業收購,進行加強監視的動作。川普政府目前對于收購美國企業的中國公司,存在著高度警戒,雖然聲明并不是針對特定...
毫無疑問,內存和存儲是近年來數據中心技術創新最活躍的領域之一。云計算、人工智能、大數據等相關應用的蓬勃發展,驅動著以SCM(Storage Class Memory)和大容量閃存為代表的新技術加速在數據中心中的部署與應用,也讓SCM和閃存成為眾多廠商爭相投資和布局的重點。在眾多廠商中,英特爾無疑是在內存和存儲領域走在最前沿的公司之一。近日,在韓國首爾的2019 ...
10月7日凌晨,蘋果正式官宣將在北京時間10月14日凌晨1點召開新品發布會,屆時全新的iPhone 12系列手機即將與我們見面。根據最新消息來看,除iPhone 12外,蘋果還將在此次新品發布會上為我們帶來多款新產品,其中就包含了小尺寸的HomePod mini。HomePod mini據外媒報道稱,HomePod mini是一個全新的品類,它將與幾年前發布的HomePod并存。與此前發布的...
很少有大公司出面斷然否認整個報告,但任天堂今天就是這么做的。  據 The Verge 報道,任天堂今日發布了一份新聞稿,堅稱彭博社爆料的 4K 版 Switch Pro 游戲機的信息完全不正確。  任天堂在新聞稿中指出彭博社“錯誤地宣稱任天堂正在為支持 4K 的任天堂 Switch 提供游戲開發工具”,并堅稱這是“假的”。另外,任天堂表示,除了...

史海拾趣

問答坊 | AI 解惑

兼職pcb設計

本人在一家研發公司擔任Pcb layout工程師。 具有多年的電路設計和PCB設計經驗,能獨立處理工作,有多層板和高密度板的設計經驗,有著電子專業水平和硬件設計能力,設計過單面,雙面,4層,6層.8層和多層板。 熟悉PCB生產加工工藝和PCB裝配精度要求 ...…

查看全部問答∨

單片機keil c語言入門

本帖最后由 paulhyde 于 2014-9-15 09:10 編輯 RT  …

查看全部問答∨

電源設計技巧有沒有比較實用的公式?

在書本上有許多電源設計公式,有點糊涂,請各位指教。…

查看全部問答∨

請問,在BSP中應如何修改SDHC驅動,讓它支持多個SD設備,請給一些思路(如可以接二個SD卡座).

現有的BSP中只支持一個SD卡.(問題1:一般來說 CPU物理上應可支持多個SD卡,它應有相關寄存器表示支持的SDIO設備數, 是不是這樣?)   問題2: 請問,在BSP中應如何修改SDHC驅動,讓它支持多個SD設備,請給一些思路(如可以接二個SD卡座 ...…

查看全部問答∨

變量中一個符號的疑問

typedef struct {     PhysicalAddress bufY;     PhysicalAddress bufCb;     PhysicalAddress bufCr; } FrameBuffer; static  FrameBuffer*  pAvailableFrameBuf; static    ...…

查看全部問答∨

請教各位一個signed int相加的問題

例如有8個signed int相加,因為結果不會大于0xfff但可能大于0xff所以用三個字節來存放計算結果, 現在就有一個麻煩了,三個字節的結果我怎么知道它是正的還是負的?…

查看全部問答∨

STM3210E-EVAL開發板價格是多少?

                                 STM3210E-EVAL開發板價格是多少?有人可以告之嗎?…

查看全部問答∨

求Stm32的SPI收發數據的程序,包括spi配置。謝了

                                 今天在做STM32讀寫RN8209的程序。RN8209有SPI通信接口,然而讀取回來的一直是0xff,就是寫進寄存器的數據也是讀出這 ...…

查看全部問答∨

電源變壓器的比較

一、變壓器的制作中,線圈的機器繞制和手工繞制各有什么優缺點? 機器繞制變壓器的優點是效率高且外觀成形漂亮,但繞制高個子小洞眼的環型變壓器卻比較麻煩,而且在絕緣處理工藝的可靠性方面反不如手工繞制到位。手工繞制可以將變壓器的漏磁做得非 ...…

查看全部問答∨

TVP5150的數據輸出口可以直接接SAA7121數據輸入口嗎?

TVP5150的數據輸出口可以直接接SAA7121數據輸入口嗎?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 建瓯市| 和硕县| 蓬溪县| 台山市| 南和县| 故城县| 云浮市| 阳信县| 启东市| 开封县| 兴业县| 凤山县| 丽江市| 化德县| 太谷县| 定州市| 钟祥市| 平邑县| 绥芬河市| 永安市| 固安县| 基隆市| 得荣县| 阳新县| 新建县| 宽甸| 彝良县| 克东县| 玉龙| 钦州市| 和龙市| 旅游| 陆良县| 闽侯县| 中阳县| 马龙县| 襄垣县| 广东省| 股票| 开江县| 桦甸市|