历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2018年10月12日 | Tiny210按键分层分离(总线-驱动-设备模型)

发布者:二进制游侠 来源: eefocus关键字:Tiny210  按键分层分离 手机看文章 扫描二维码
随时随地手机看文章

led_dev.c驱动源码:

#include "linux/module.h"

#include "linux/version.h"

#include "linux/init.h"

#include "linux/kernel.h"

#include "linux/types.h"

#include "linux/interrupt.h"

#include "linux/list.h"

#include "linux/timer.h"

#include "linux/init.h"

#include "linux/serial_core.h"

#include "linux/platform_device.h"

// 分配/设置/注册一个platform_device 

static struct resource led_resource[] = {

    [0] = {

        .start = 0xE0200280,

        .end   = 0xE0200280 + 8 - 1,

        .flags = IORESOURCE_MEM,

    },

    [1] = {

        .start = 0,

        .end   = 0,

        .flags = IORESOURCE_IRQ,

    }

};

static void led_release(struct device * dev)

{

}

static struct platform_device led_dev = {

    .name                  = "myled",

    .id                        = -1,

    .num_resources  = ARRAY_SIZE(led_resource),

    .resource             = led_resource,

    .dev = { 

        .release            = led_release, 

    },

};

static int led_dev_init(void)

{

    platform_device_register(&led_dev);

    return 0;

}

static void led_dev_exit(void)

{

    platform_device_unregister(&led_dev);

}

module_init(led_dev_init);

module_exit(led_dev_exit);

MODULE_LICENSE("GPL");

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

led_drv.c驱动源码:

// 分配/设置/注册一个platform_driver 

#include "linux/module.h"

#include "linux/version.h"

#include "linux/init.h"

#include "linux/fs.h"

#include "linux/interrupt.h"

#include "linux/irq.h"

#include "linux/sched.h"

#include "linux/pm.h"

#include "linux/sysctl.h"

#include "linux/proc_fs.h"

#include "linux/delay.h"

#include "linux/platform_device.h"

#include "linux/input.h"

#include "linux/irq.h"

#include "asm/uaccess.h"

#include "asm/io.h"

static int major;

static struct class *cls;

static volatile unsigned long *gpio_con;

static volatile unsigned long *gpio_dat;

static int pin;

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

{

    //printk("first_drv_open\n");

    // 配置为输出 

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

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

    return 0;    

}

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

{

    int val;

    //printk("first_drv_write\n");

    copy_from_user(&val, buf, count); //    copy_to_user();

    if (val == 1)

    {

        // 点灯

        *gpio_dat &= ~(1<

    }

    else

    {

        // 灭灯

        *gpio_dat |= (1<

    }

    

    return 0;

}

static struct file_operations led_fops = {

    .owner  =   THIS_MODULE,    // 这是一个宏,推向编译模块时自动创建的__this_module变量 

    .open   =   led_open,     

    .write  =   led_write,       

};

static int led_probe(struct platform_device *pdev)

{

    struct resource        *res;

    // 根据platform_device的资源进行ioremap 

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

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

    gpio_dat = gpio_con + 1;

    res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

    pin = res->start;

    // 注册字符设备驱动程序 

    printk("led_probe, found led\n");

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

    cls = class_create(THIS_MODULE, "myled");

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

    

    return 0;

}

static int led_remove(struct platform_device *pdev)

{

    // 卸载字符设备驱动程序 

    // iounmap 

    printk("led_remove, remove led\n");

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

    class_destroy(cls);

    unregister_chrdev(major, "myled");

    iounmap(gpio_con);

    

    return 0;

}

struct platform_driver led_drv = {

    .probe    = led_probe,

    .remove  = led_remove,

    .driver     = {

        .name = "myled",

    }

};

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 "stdio.h"

// led_test on

// led_test off

int main(int argc, char **argv)

{

    int fd;

    int val = 1;

    

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

    if (fd < 0)

    {

        printf("can't open!\n");

    }

    if (argc != 2)

    {

        printf("Usage :\n");

        printf("%s 《on|off》\n", argv[0]); //实际为"<"

        return 0;

    }

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

    {

        val  = 1;

    }

    else

    {

        val = 0;

    }

    write(fd, &val, 4);

    return 0;

}


关键字:Tiny210  按键分层分离 引用地址:Tiny210按键分层分离(总线-驱动-设备模型)

上一篇:Tiny210驱动之LCD驱动程序
下一篇:Tiny210按键输入子系统

推荐阅读

  位于瑞士巴塞尔的Innolith AG周三宣布推出一款新型电池,它可以提供10倍的寿命而成本只有现有技术的三分之一。    据公告称,该公司的技术使用非传统的无机电解质,与有机锂离子电池(Li-ion)不同的是,该技术不易燃,而且耐用性高得多。   Innolith技术的原型已经部署在美国电网上。   在另一份新闻稿中,该公司表示,当其新电池技术...
本阶段任务与步骤================1,设置好共享文件夹2,编译这些代码: make3,将编译好的示例程序piano丢到开发板,观察运行效果 注意:要将所有的bmp文件也要上传到开发板(已经上传过了就不用重复上传了)4,修改piano.c,使得钢琴12个琴键均能按下去。 单片机源程序如下:/***********************************************//// Copyright(C),...
苹果公司、Facebook、谷歌和亚马逊这四家科技公司一直是美国众议院司法机构反垄断小组委员会正在进行的反垄断调查的对象。近日,反垄断小组委员会发布了一份449页的报告,认为苹果、亚马逊(AMZN.US)、谷歌(GOOG.US,GOOGL.US)和Facebook(FB.US)存在滥用市场权力的情况。上述四家科技企业在以下领域享有垄断权。苹果:在iOS设备上分发软件应用;亚马逊:大...
9月28日,OFweek 2021中国智能制造数字化转型峰会暨维科杯工业自动化及数字化行业年度评选颁奖典礼盛大开幕,辰星(天津)自动化设备有限公司荣获维科杯·OFweek2021中国工业自动化及数字化行业卓越技术创新企业奖,CEO宋涛作为企业核心领导人,获得维科杯·OFweek2021中国工业自动化及数字化行业先锋人物奖。29日,在OFweek 2021中国机器人系统集成商峰...

史海拾趣

问答坊 | AI 解惑

关注IC设计基地模式创新

关注IC设计基地模式创新 来源: 作者: 添加日期:2005-10-21 11:56:00 点击次数: 16   经过四年以上的运作,七个国家级集成电路设计产业化基地已经在孵化小企业、构建公共服务平台方面取得了相当成就,今后,集成电路设计产业化基 ...…

查看全部问答∨

基于AVR单片机的汽车空调控制系统

基于AVR单片机的汽车空调控制系统 要论文+仿真 一口价:300元 有意者联系: qq:756805375 邮箱:ydc888888@163.com 手机:(只接受短信)15852492541…

查看全部问答∨

波纹去除方法of(开关电源+LDO)

最近设计一个电路,输入为24V,要求输出为正负12V,电流300mA,供传感器用 所以系统的功率是3W 方案如下lm2576由24V产生5V,MAX742(频率100kHz)由5V产生正负精度为4%的正负15V电源 再由lm7812与lm7912产生-12V 问电路这样设计有什么bug [ 本帖最后 ...…

查看全部问答∨

HDB3编解码原理

HDB3(High Density Bipolar三阶高密度双极性)码是在AMI码的基础上改进的一种双极性归零码,它除具有AMI码功率谱中无直流分量,可进行差错自检等优点外,还克服了AMI码当信息中出现连“0”码时定时提取困难的缺点,而且HDB3码频谱能量主要集中在基波 ...…

查看全部问答∨

刚学can总线,大家看理解对不?

can是以报文的形式传输,每个报文包括数据帧,远程帧,出错帧,超载帧。帧结构又有字符组成,字符由位组成,也就是高低电平,然后这样在接线上传输。…

查看全部问答∨

全局变量

本帖最后由 dontium 于 2015-1-23 13:29 编辑 请问高手: 1.  2407A的汇编编程中.BSS和.usect 定义的变量是不是都是全局变量? 2.  任何子程序都能调用这些变量? 3.  有没有局部变量? 谢谢! …

查看全部问答∨

【求助】请问斑竹热表程序问题

在in_out_temperature子程序,也就是测温子程序中 为何要先测一下R18 另外adc_delay有什么用…

查看全部问答∨

avr资料和项目 任你选

avr学习资料全了 任你选…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved