datasheet

Tiny210块设备驱动之内存模拟磁盘

2018-10-12来源: eefocus 关键字:Tiny210  块设备驱动  内存模拟磁盘

ramblock.c驱动源码:

#include "linux/module.h"

#include "linux/errno.h"

#include "linux/interrupt.h"

#include "linux/mm.h"

#include "linux/fs.h"

#include "linux/kernel.h"

#include "linux/timer.h"

#include "linux/genhd.h"

#include "linux/hdreg.h"

#include "linux/ioport.h"

#include "linux/init.h"

#include "linux/wait.h"

#include "linux/blkdev.h"

#include "linux/blkpg.h"

#include "linux/delay.h"

#include "linux/io.h"

#include "linux/gfp.h"

#include "linux/slab.h"

#include "asm/system.h"

#include "asm/uaccess.h"

#include "asm/dma.h"

#define RAMDISK_SIZE (1024*1024)

static DEFINE_SPINLOCK(ramdisk_lock);

static const struct block_device_operations ramdisk_fops = {

    .owner    = THIS_MODULE,

};

static struct gendisk *ramblock_disk;

static struct request_queue *ramblock_queue;

static unsigned char *ram_buff;

static int major;

static void ramblock_do_request(struct request_queue * q)

{

    struct request *req;

    printk("do:ramblock_do_request\n");

    req = blk_fetch_request(q);

    while (req) 

    {

        //源或目的

        unsigned long offset = blk_rq_pos(req) * 512;

        //目的或源

        //req->buffer

        

        //长度

        unsigned long len  = blk_rq_cur_bytes(req);

        if (rq_data_dir(req) == READ)

            memcpy(req->buffer, ram_buff+offset, len);

        else

            memcpy(ram_buff+offset, req->buffer, len);

        // wrap up, 0 = success, -errno = fail 

        if (!__blk_end_request_cur(req, 0))

            req = blk_fetch_request(q);

    }

}

static int ramblock_init(void)

{

    //获得主设备号

    major = register_blkdev(major, "ramdisk");

    //1.分配一个gendisk结构体

    ramblock_disk = alloc_disk(16);

    

    //2.设置

    //2.1设置一个请求队列

    ramblock_queue = blk_init_queue(ramblock_do_request, &ramdisk_lock);

    ramblock_disk->queue = ramblock_queue;

    //2.2设置其他信息

    ramblock_disk->major = major;

    ramblock_disk->first_minor = 0;

    sprintf(ramblock_disk->disk_name, "ramdisk");

    ramblock_disk->fops = &ramdisk_fops;

    set_capacity(ramblock_disk, RAMDISK_SIZE);

    //3.硬件相关

    ram_buff = kzalloc(RAMDISK_SIZE, GFP_KERNEL);

    //4.注册

    add_disk(ramblock_disk);

    return 0;

}

static void ramblock_exit(void)

{

    unregister_blkdev(major, "ramdisk");

    del_gendisk(ramblock_disk);

    put_disk(ramblock_disk);

    blk_cleanup_queue(ramblock_queue);

    kfree(ram_buff);

}

module_init(ramblock_init);

module_exit(ramblock_exit);

MODULE_LICENSE("GPL");


关键字:Tiny210  块设备驱动  内存模拟磁盘

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

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

关注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