历史上的今天
返回首页

历史上的今天

今天是:2024年10月11日(星期五)

正在发生

2018年10月11日 | OK6410块设备驱动内存模拟nor_flash

2018-10-11 来源:eefocus

ram_nor.c源码:

//参考: drivers\mtd\chips\map_ram.c 

#include "linux/module.h"

#include "linux/types.h"

#include "linux/kernel.h"

#include "linux/sched.h"

#include "linux/init.h"

#include "asm/io.h"

#include "asm/byteorder.h"

#include "linux/errno.h"

#include "linux/slab.h"

#include "linux/delay.h"

#include "linux/interrupt.h"

#include "linux/reboot.h"

#include "linux/bitmap.h"

#include "linux/mtd/xip.h"

#include "linux/mtd/map.h"

#include "linux/mtd/mtd.h"

#include "linux/mtd/compatmac.h"

#include "linux/mtd/cfi.h"

#define RAM_BLOCK_SIZE (512*1024)

static unsigned char *ramnor_buf;

static struct mtd_info *ram_nor_mtd;

static int ram_nor_erase(struct mtd_info *mtd, struct erase_info *instr)

{

    int i;

    unsigned char *buf = ramnor_buf + instr->addr;

    static int cnt = 0;

    printk("%s : %d\n", __FUNCTION__, cnt++);

    

    for (i = 0; i < instr->len; i++)

    {

        buf[i] = 0xff;

    }

    

    instr->state = MTD_ERASE_DONE;

    mtd_erase_callback(instr);

    return 0;

}

static int ram_nor_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)

{

    static int cnt = 0;

    printk("%s : %d\n", __FUNCTION__, cnt++);

    printk("thread: pid = %d, name = %s\n", current->pid, current->comm);

    memcpy(buf, ramnor_buf+from, len);

    *retlen = len;

    return 0;

}

static int ram_nor_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)

{

    static int cnt = 0;

    printk("%s : %d\n", __FUNCTION__, cnt++);

    memcpy(ramnor_buf+to, buf, len);

    *retlen = len;

    return 0;    

}

static void ram_nor_sync_nop(struct mtd_info *mtd)

{

}

static int ram_nor_init(void)

{

    ramnor_buf = kmalloc(RAM_BLOCK_SIZE, GFP_KERNEL);

    memset(ramnor_buf, 0xff, RAM_BLOCK_SIZE);

    // alloc/setup mtd_info 

    ram_nor_mtd = kzalloc(sizeof(*ram_nor_mtd), GFP_KERNEL);;

    ram_nor_mtd->type = MTD_NORFLASH;

    // Fill in the default mtd operations 

    ram_nor_mtd->erase   = ram_nor_erase;

    ram_nor_mtd->read    = ram_nor_read;

    ram_nor_mtd->write   = ram_nor_write;

    ram_nor_mtd->name    = "ram_nor";

    ram_nor_mtd->size    = RAM_BLOCK_SIZE;

    ram_nor_mtd->sync    = ram_nor_sync_nop;

    ram_nor_mtd->flags   = MTD_CAP_RAM;

    ram_nor_mtd->writesize = 1;

    ram_nor_mtd->erasesize = 512;

    add_mtd_device(ram_nor_mtd); // add_mtd_partitions

    

    return 0;

}

static void ram_nor_exit(void)

{

    del_mtd_device(ram_nor_mtd);

    kfree(ram_nor_mtd);

    kfree(ramnor_buf);

}

module_init(ram_nor_init);

module_exit(ram_nor_exit);

MODULE_LICENSE("GPL");

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

Makefile文件:

all:

    make -C /media/sda8/wei/linux-2.6.28_smdk6410 M=`pwd` modules

clean:

    make -C /media/sda8/wei/linux-2.6.28_smdk6410 M=`pwd` clean

obj-m += ram_nor.o

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

测试详情可以参考:“JZ2440之NOR FLASH驱动程序”


推荐阅读

史海拾趣

上海国芯(Gcore)公司的发展小趣事
确保报警装置(如蜂鸣器、LED灯等)能够正常工作。
振华(CEC)公司的发展小趣事

中国振华电子集团有限公司(简称振华)自成立之初,就致力于电子产品的研发与生产。初期,公司面临着技术落后、资金短缺等诸多困难,但创始人及团队凭借坚定的信念和不懈的努力,成功开发出了一系列具有市场竞争力的电子产品。随着产品质量的提升和市场份额的扩大,振华逐渐在电子行业中崭露头角。

Advanced Components Industries Inc公司的发展小趣事

随着环保意识的日益增强,ACI积极响应国家号召,致力于绿色电子产品的研发和生产。公司投入大量资源研发环保材料和技术,推出了一系列符合环保标准的产品。

这些绿色电子产品在市场上受到了广泛欢迎。消费者越来越关注产品的环保性能,ACI的产品正好满足了这一需求。同时,公司的环保理念也得到了社会各界的认可和支持,进一步提升了公司的品牌形象。

FINDER公司的发展小趣事

在快速发展的过程中,ACI始终注重品质管理。公司建立了严格的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,ACI还积极推行持续改进的理念,不断优化生产流程,提高生产效率。

这些努力使得ACI的产品在市场上赢得了良好的口碑。客户对公司的产品和服务给予了高度评价,纷纷表示愿意与ACI建立长期合作关系。这些正面的反馈进一步推动了ACI的发展。

CINTERION公司的发展小趣事

2010年,电子支付与身份识别技术领域的领军企业金雅拓,全资收购了CINTERION。这一资本动作不仅为CINTERION带来了更多的资金支持,更使其在金雅拓的物联网事业部中获得了更广阔的发展空间。收购完成后,CINTERION继续保持其技术领先地位,并在金雅拓的推动下,进一步拓宽了产品线和应用领域。

ALTERA(阿尔特拉)公司的发展小趣事

CINTERION的前身可追溯到西门子于1995年创建的无线模块业务。在成立之初,该公司便专注于工业用机器对机器(M2M)无线通信模块的研发与生产。随着技术的不断进步,CINTERION逐渐在行业内崭露头角,其产品在智能电网、汽车、公用事业等领域得到了广泛应用。1996年,CINTERION成功推出了全球第一款蜂窝模组,这一创新为公司在无线通信模组市场打下了坚实的基础。

问答坊 | AI 解惑

嵌入式系统与以太网的连接

1 引言   目前,以太网(Ethernet)协议已经非常广泛地应用于各种计算机网络,如办公局域网、工业控制网络等场合,并且还不断地发展。基于以太网的新技术和联网设备不断出现,以太网已经成为事实上最常用的局域网络标准之一。但是,基于以太网的 ...…

查看全部问答>

求嵌入式方面的英文论文

求嵌入式方面的英文论文一篇,能带翻译的最好,没有也可以,也可以给我下载地址之类的,先谢过各位了。…

查看全部问答>

这年头连妓女都敬业

 7月27日晚,在常德市严打整治统一集中清查行动中,武陵区公安分局城西派出所查处了位于该市人民西路的一家休闲洗浴中心的卖淫嫖娼窝点,当场抓获3对涉嫌买淫嫖娼的男女。    行动中,民警在房内不仅查获了几张淫秽光盘和顾客对卖淫女 ...…

查看全部问答>

嵌入式应用前景

       嵌入式领域较新,目前发展非常快。那么嵌入式前景如何?下面就由福州卓跃教育就这个问题为大家做具体介绍。        嵌入式系统技术具有非常广阔的应用前景,其应用领域可 ...…

查看全部问答>

tcp/ip

现在想学习TCP/IP,大家都在学吧…

查看全部问答>

FPGA如何实现CAN通讯?

小弟现在想做一下用FPGA来实现其与ARM开发板的CAN通讯,不知道会不会很难?…

查看全部问答>

有源晶振输出不正常,可能是哪里的问题

20MHz的有源晶振,5V供电,4脚 ,输出只有约500mv的畸变正弦波,有可能是哪里的问题 \0\0\0eeworldpostqq…

查看全部问答>

Delay函数实现的延时是怎样计算的???

C语言延时程序: 10ms延时子程序(12MHZ) void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } 1s延时子程序(12MHZ) void delay1s(void) { unsigned char h,i,j,k; for(h=5;h> ...…

查看全部问答>