datasheet

Tiny210按键分层分离(总线-驱动-设备模型)

2018-10-12来源: 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  按键分层分离

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news101241700.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Tiny210驱动之LCD驱动程序
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

新型Silicon Labs Tiny Gecko MCU有效延长 IoT连接设备电池寿命

中国,北京-2018年3月8日-Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)扩展其广受欢迎的EFM32™ Tiny Gecko微控制器(MCU)系列产品,旨在满足开发人员进行下一代安全、电池供电型物联网(IoT)连接设备的设计需求。Silicon Labs新型EFM32TG11 Tiny Gecko MCU为需要长电池寿命的设备提供了低成本的超低功耗解决方案,且不会减弱功能和降低安全性。Tiny Gecko 11 MCU是智能电表、个人医疗设备和家庭自动化产品的理想选择,这些产品通常具有多个传感器、本地显示和触摸控制。新型MCU可在IoT设计中作为独立微控制器或搭配网络协处理器使用,这为开发人员提供了出色
发表于 2018-03-09
新型Silicon Labs Tiny Gecko MCU有效延长 IoT连接设备电池寿命

Tiny6410 交叉编译helloworld程序

在工作目录下建立helloworld.c文件 #include <stdio.h>  main()  {      printf("helloworld!\n");  }  保存关闭后。 编译helloworld文件: root@snail:/home/workdir/qt/project/helloworld# arm-linux-gcc helloworld.c -o hellow
发表于 2017-01-12
Tiny6410 交叉编译helloworld程序

Tiny6410 设备驱动之helloworld

;  //模块初始化  static int __init hello_init(void)  {      printk(KERN_ALERT "Hello world!\n");      return 0;  }  //模块退出  static void  __exit 
发表于 2017-01-12
Tiny6410 设备驱动之helloworld

Tiny6410 LED字符设备驱动

; #define LED_3_OFF   7  #define LED_4_ON    8  #define LED_4_OFF   9       static int led_open (struct inode *inode,struct file *filp)    
发表于 2017-01-12
Tiny6410 LED字符设备驱动

瑞萨单片机教程之R8C/Tiny

第二节  Tiny系列 1.1  Tiny系列     瑞萨正在拓展在SuperH、M16C、H8、H8S等瑞萨所提供的高性能MCU各族及各系列上安装了闪存的品种,该产品群多达28类,品种超过了200种,想必也只有瑞萨能拥有如此之多的闪存MCU产品。在这些瑞萨的闪存MCU中,内置高性能内核与闪存,同时实现少引脚和小型封装的单芯片MCU,就是“Tiny系列”。 8〜32位齐全的Tiny系列(Tiny的定位图) Tiny系列拥有以下众多优点。 ① 高性能CPU(16位、32位)、小型化的20〜80引脚的少引脚封装
发表于 2016-05-17

S3C6410,Tiny6410,Mini6410,MoblieDDR内存驱动

0   扩展内存命令 [22] (见下表)   芯片号 [21:20] 映射到外部存储芯片地址的位   命令 [19:18] 具体命令(见下表)   Bank地址 [17:16] 当以MRS或EMRS命令访问时,映射到外部存储器的Bank地址位  
发表于 2016-04-26
S3C6410,Tiny6410,Mini6410,MoblieDDR内存驱动

小广播

何立民专栏

单片机及嵌入式宝典

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

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