友善之臂Mini2440之嵌入式Linux下Nor Flash驱动程序设计

发布者:BlossomSunrise最新更新时间:2022-10-19 来源: csdn关键字:友善之臂  Mini2440  Linux  Nor  Flash  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

前面已经详细讲述了MTD子系统原理知识,这一节讲述嵌入式Linux下对NorFlash的驱动程序设计。在MTD设备层上有MTD字符设备和MTD块设备。


1、MTD字符设备层的源码文件为/mtd/mtdchar.c。该源码文件为MTD原始设备提供了一个字符设备访问接口,使得上层应用程序可以以字符设备的方式来访问MTD原始设备。mtdchar.c主要定义了一个字符设备访问文件操作函数和向内核注册了一个字符设备,MTD字符设备的主设备号为90,源码如下:


#define MTD_CHAR_MAJOR 90

#define MTD_BLOCK_MAJOR 31


static const struct file_operations mtd_fops = {

 .owner  = THIS_MODULE,

 .llseek  = mtd_lseek,

 .read  = mtd_read,

 .write  = mtd_write,

 .ioctl  = mtd_ioctl,

#ifdef CONFIG_COMPAT

 .compat_ioctl = mtd_compat_ioctl,

#endif

 .open  = mtd_open,

 .release = mtd_close,

 .mmap  = mtd_mmap,

#ifndef CONFIG_MMU

 .get_unmapped_area = mtd_get_unmapped_area,

#endif

};


接着在MTD字符设备驱动的模块初始化函数中注册MTD字符设备,代码如下:


static int __init init_mtdchar(void)

{

 int status;


 status = register_chrdev(MTD_CHAR_MAJOR, "mtd", &mtd_fops);

 if (status < 0) {

  printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices.n",

         MTD_CHAR_MAJOR);

 }


 return status;

}


2、MTD块设备


mtd/mtd_blkdevs.c源代码文件提供了MTD 转换层设备和块设备访问之间的接口。该文件定义了块设备访问接口函数,代码如下:


static const struct block_device_operations mtd_blktrans_ops = {

 .owner  = THIS_MODULE,

 .open  = blktrans_open,

 .release = blktrans_release,

 .locked_ioctl = blktrans_ioctl,

 .getgeo  = blktrans_getgeo,

};


add_mtd_blktrans_dev函数用来将一个MTD转换层设备注册到内核中,每一个MTD转换层设备都对应一个通用磁盘设备。add_mtd_blktrans_dev函数针对一个MTD转换层设备分配了一个磁盘设备结构体,并调用函数add_disk注册磁盘设备到内核中。


int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)

{

 struct mtd_blktrans_ops *tr = new->tr;

 struct mtd_blktrans_dev *d;

 int last_devnum = -1;

 struct gendisk *gd;


 if (mutex_trylock(&mtd_table_mutex)) {

  mutex_unlock(&mtd_table_mutex);

  BUG();

 }


 list_for_each_entry(d, &tr->devs, list) {

  if (new->devnum == -1) {

   /* Use first free number */

   if (d->devnum != last_devnum+1) {

    /* Found a free devnum. Plug it in here */

    new->devnum = last_devnum+1;

    list_add_tail(&new->list, &d->list);

    goto added;

   }

  } else if (d->devnum == new->devnum) {

   /* Required number taken */

   return -EBUSY;

  } else if (d->devnum > new->devnum) {

   /* Required number was free */

   list_add_tail(&new->list, &d->list);

   goto added;

  }

  last_devnum = d->devnum;

 }

 if (new->devnum == -1)

  new->devnum = last_devnum+1;


 if ((new->devnum << tr->part_bits) > 256) {

  return -EBUSY;

 }


 list_add_tail(&new->list, &tr->devs);

 added:

 mutex_init(&new->lock);

 if (!tr->writesect)

  new->readonly = 1;


 gd = alloc_disk(1 << tr->part_bits);

 if (!gd) {

  list_del(&new->list);

  return -ENOMEM;

 }

 gd->major = tr->major;

 gd->first_minor = (new->devnum) << tr->part_bits;

 gd->fops = &mtd_blktrans_ops;


 if (tr->part_bits)

  if (new->devnum < 26)

   snprintf(gd->disk_name, sizeof(gd->disk_name),

     "%s%c", tr->name, 'a' + new->devnum);

  else

   snprintf(gd->disk_name, sizeof(gd->disk_name),

     "%s%c%c", tr->name,

     'a' - 1 + new->devnum / 26,

     'a' + new->devnum % 26);

 else

  snprintf(gd->disk_name, sizeof(gd->disk_name),

    "%s%d", tr->name, new->devnum);


 /* 2.5 has capacity in units of 512 bytes while still

    having BLOCK_SIZE_BITS set to 10. Just to keep us amused. */

 set_capacity(gd, (new->size * tr->blksize) >> 9);


 gd->private_data = new;

 new->blkcore_priv = gd;

 gd->queue = tr->blkcore_priv->rq;

 gd->driverfs_dev = &new->mtd->dev;


 if (new->readonly)

  set_disk_ro(gd, 1);


 add_disk(gd);


 return 0;

}


MTD原始设备>>转换层设备>>磁盘设备>>块设备(">>"是属于的意思)。


mtdblock.c源文件实现了MTD块设备层驱动,定义了一个转换层设备操作函数接口。


static struct mtd_blktrans_ops mtdblock_tr = {

 .name  = "mtdblock",

 .major  = 31,

 .part_bits = 0,

 .blksize  = 512,

 .open  = mtdblock_open,

 .flush  = mtdblock_flush,

 .release = mtdblock_release,

 .readsect = mtdblock_readsect,

 .writesect = mtdblock_writesect,

 .add_mtd = mtdblock_add_mtd,

 .remove_dev = mtdblock_remove_dev,

 .owner  = THIS_MODULE,

};


然后调用register_mtd_blktrans(&mtdblock_tr)注册一个转换层设备。


关键字:友善之臂  Mini2440  Linux  Nor  Flash  驱动程序 引用地址:友善之臂Mini2440之嵌入式Linux下Nor Flash驱动程序设计

上一篇:友善之臂Mini2440之嵌入式Linux下应用程序对Nand Flash的读写操作
下一篇:基于Linux-2.6.32.2在mini2440驱动分析一:串口驱动

推荐阅读最新更新时间:2024-11-20 10:26

提高MSP430G系列单片机的Flash 擦写寿命的方法
摘要 在嵌入式设计中,许多应用设计都需要使用EEPROM 存储非易失性数据,由于成本原因,某些单片机在芯片内部并没有集成EEPROM。MSP430G 系列处理器是TI 推出的低成本16 位处理器,在MSP430G 系列单片机中并不具备EEPROM。为了存储非易失性数据,MSP430G 系列处理器在芯片内部划分出了256 字节的Flash 空间作为信息Flash,可用于存储非易失性数据,但是由于Flash 与EEPROM 在擦写寿命上存在一定差距,所以在实际应用中,这种应用方式并不能够满足所有客户的需求。本应用笔记介绍了使用代码区域Flash 来模拟EEPROM,通过一定的软件处理算法,可以大大增加数据存储周期的一种方法。本文
[嵌入式]
提高MSP430G系列单片机的<font color='red'>Flash</font> 擦写寿命的方法
2017年内NOR Flash价格将每季上涨5%
据全球市场研究机构集邦咨询最新研究指出,受到今年搭载AMOLED面板的智能手机数量大幅增加,以及TDDI技术所需NOR Flash产能提升的带动,加上如美光、兆易创新等主要供应厂商供给量下滑,导致今年NOR Flash因产能不足而出现价格弹升状况,预计NOR Flash将出现每季至少5%的涨幅,其涨势将延续至年底。 TrendForce指出,观察供给端,最高端NOR Flash产品多由美光、Cypress供应,供应容量为64Mb、128Mb,华邦、旺宏则以NOR Flash中端产品供应为主,多供应16Mb、32Mb、64Mb产品,而兆易创新提供的多为低端产品,供应容量为512kb、1~2Mb。以营收作为市占率计算基准,Cypr
[手机便携]
bootloader中关于flash擦除写和ram初始化的问题
liangboone君,还有个地方没弄明白,请教下。 “全局变量和静态变量的初始化值是保存在Flash中的Const段里的”: 这个const段的起始地址和内容也是在s19文件里的吧。可是bootloader的s19文件和应用的s19文件,要手动合成一个s19文件后烧入mcu的flash里,其中应用的s19文件只把中断向量表的地址重映射了,const段地址应该没有变动,这样const段不会重叠吗?boot或者app程序调用Startup函数的时候会不会把boot和app的全局变量、动态变量都复制到ram? (1) bootlaoder的需要初始化值对应的const段和application的不在一个地方。在prm里面进行段配置的
[单片机]
Linux-2.6.32.2内核在mini2440上的移植(十四)---移植看门狗驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 Linux-2.6.32.2 内核具有完善的S3C2440 的看梦狗驱动,我们只需配
[单片机]
世强签约兆易创新,新增NOR Flash、NAND Flash产品
新增NOR Flash、NAND Flash等产品,世强与国内存储及物联网芯片产业的龙头企业兆易创新(GigaDevice)签约。 兆易创新旗下Flash 累计出货量超过100亿颗,其 NOR Flash、NAND Flash,具有高可靠性、低功耗及适应便携式应用等特点,并已通过SGS ISO9001及ISO14001等管理体系的认证,可广泛应用于手持移动终端、消费类电子产品、个人电脑及周边,网络、电信设备、医疗设备、办公设备、汽车电子及工业控制设备等领域。 本次签约后,世强不仅可提供优质低价的兆易创新元件供应服务,保障大量现货库存、1PCS起购、最快当日发货,还可提供兆易创新相关的资料的下载、选型帮助服务、样品服务、技
[半导体设计/制造]
世强签约兆易创新,新增<font color='red'>NOR</font> <font color='red'>Flash</font>、NAND <font color='red'>Flash</font>产品
linux下avr单片机开发:中断服务程序
不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-avr有所差异,这里对linux下中断服务程序编写做个简要介绍。 首先是要引入的库: #include avr/io.h #include avr/interrupt.h 这两个是中断程序所要用到的,中断程序的编写位置,只要是在工程里的某个c文件里面就可以了。 具体格式: ISR(INT1_vect) { //...................................// } 其中的INT1
[单片机]
NT下视频采集及解压驱动程序的设计与实现
    摘要: 分析了多媒体设备驱动程序的体系结构及视频采集与解压卡的驱动程序设计方案。描述了核心态驱动程序的处理流程,提供了用户态驱动程序的设计思路和具体算法。     关键词: 驱动程序 IRP(输入输出请求包) 驱动程序对象 设备对象 Windows NT的结构决定了应用程序不能直接操作硬件设备,它只能通过一个中间层来读写和控制设备,这个中间层就是驱动程序。驱动程序位于计算机软件的最低层(HAL 为硬件抽象层),直接与硬件设备的特性联系在一起。编写驱动程序不仅要了解设备的特性,而且还要了解操作系统的结构,难度较大。本文比较详细地分析了视频采集与解压卡的驱动程序设计思路。 1 视频
[应用]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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