S3C2440 nor_flash驱动程序

发布时间:2024-08-13  

和前面的nandflash差不多,我们此处来重新学习一下norflash驱动。


  1 /*

  2  * 参考 driversmtdmapsPhysmap.c

  3  */

  4 

  5 #include

  6 #include

  7 #include

  8 #include

  9 #include

 10 #include

 11 #include

 12 #include

 13 #include

 14 #include

 15 #include

 16 #include

 17 #include

 18 

 19 //定义nor flash的分区

 20 static struct mtd_partition lhy_nor_part[] = {

 21     [0] = {

 22         .name    = 'nor bootloader',

 23         .size    = 0x40000,

 24         .offset    = 0,

 25     },

 26     [1] = {

 27         .name    = 'nor root',

 28         .offset = MTDPART_OFS_APPEND,

 29         .size    = MTDPART_SIZ_FULL,        //剩余的所有大小

 30     },

 31 };

 32 

 33 static struct map_info *lhy_nor_map;

 34 static struct mtd_info *lhy_nor_mtd;  //动态创建

 35 

 36 static int lhy_nor_init(void)

 37 {

 38     /* 1.分配map_info结构体 */

 39     lhy_nor_map = kzalloc(&dev->dev, sizeof(struct map_info),GFP_KERNEL);

 40     /* 2.设置:物理基地址(phys),大小(size),位宽(bankwidth),虚拟基地址(virt) */

 41     lhy_nor_map->name = 'lhy_nor';  //名字

 42     lhy_nor_map->phys = 0x0;        //基地址

 43     lhy_nor_map->size = 0x1000000;    //大小,>=nor的真正大小

 44     lhy_nor_map->bankwidth = 2;        //位宽16位

 45 

 46     lhy_nor_map->virt = ioremap(lhy_nor_map->phys,lhy_nor_map->size); //映射地址

 47     

 48     simple_map_init(lhy_nor_map);    //简单的初始化

 49     

 50     /* 3.使用: 调用nor flash协议层提供的函数来识别 */

 51     printk('<0>use cfi_proben');

 52     lhy_nor_mtd = do_map_probe('cfi_probe',lhy_nor_map);

 53     if(!lhy_nor_mtd){

 54         printk('<0>use jedec_proben');

 55         lhy_nor_mtd = do_map_probe('jedec_probe',lhy_nor_map);

 56     }

 57     if(!lhy_nor_mtd){

 58         iounmap(lhy_nor_map->virt);

 59         kfree(lhy_nor_map);

 60         return -EIO;

 61     }

 62         

 63     /* 4.添加分区: add_mtd_partitions */

 64     add_mtd_partitions(lhy_nor_mtd,lhy_nor_part,2); //总共两个分区

 65     return 0;

 66 }

 67 

 68 static void lhy_nor_exit(void)

 69 {

 70     if(lhy_nor_map){

 71         iounmap(lhy_nor_map->virt);

 72         kfree(lhy_nor_map);

 73         del_mtd_partitions(lhy_nor_mtd);

 74     }

 75 }

 76 

 77 module_init(lhy_nor_init);

 78 module_exit(lhy_nor_exit);

 79 MODULE_LICENSE('GPL');

 80 

 81 /*

 82 

 83 使用U-BOOT来体验NOR FLASH 的操作(开发板设为NOR启动,进入U-BOOT)

 84 使用OpenJTAG烧写U-BOOT到nor flash

 85 1.读数据

 86 md.b 0

 87 

 88 2.读ID

 89 往地址555H写入AAH

 90 往地址2AAH写入55H

 91 往地址555H写入90H

 92 读0地址得到厂家ID      C2H

 93 读1地址得到设备ID    22DAH/225DH

 94 退出读ID状态        往任意地址写入F0H

 95 

 96 由于2440的CPU的数据线和NOR的数据线相错开,所以UBOOT操作时,写的地址应该<<1得到

 97 往地址AAAH写入AAH                        mw.w aaa aa

 98 往地址554H写入55H                        mw.w 554 55

 99 往地址AAAH写入90H                        mw.w aaa 90H        

100 读0地址得到厂家ID      C2H                    md.w 0 1

101 读2地址得到设备ID    22DAH/225DH            md.w 2 1

102 退出读ID状态        往任意地址写入F0H      mw.w 0 f0

103 

104 3.NOR 手册上有两种规范,jedec,cfi(common flash interface)

105     读取CFI信息    

106     进入CFI模式,往地址55H写入98H

107     读数据:    读10H得到0051

108                 读11H得到0052

109                 读12H得到0059

110                 读27H得到容量

111 UBOOT操作时,写的地址应该左移一位

112     进入CFI模式,往地址AAH写入98H        mw.w aa 98

113     读数据:    读20H得到0051            md.w 20 1

114                 读22H得到0052           md.w 22 1    

115                 读24H得到0059           md.w 24 1

116                 读4EH得到容量           md.w 4E 1    2^n

117     退出CFI模式,往任意地址写入F0H      mw.w 0 f0

118 4.写数据    在地址0x100000写入0x1234  发现无法写数据

119 往地址555H写入AAH                        

120 往地址2AAH写入55H                        

121 往地址555H写入A0H                            

122 往烧写地址写入要写的数据

123 

124 U-BOOT操作

125 往地址AAAH写入AAH                        mw.w aaa aa

126 往地址554H写入55H                        mw.w 554 55

127 往地址AAAH写入A0H                        mw.w aaa A0H        

128 往烧写地址写入要写的数据                mw.w 100000 1234h  往1M的地址写数据

129 

130 

131 5.测试内核自带的驱动程序:

132 1).通过配置内核支持NOR FLASH

133 --> Device Drivers

134     --> Memory Technology Device (MTD) support 

135         --> Mapping drivers fro chip access

136          CFI Flash device in physical memory map

137         (0x0) Physical start address of flash mapping     //起始地址

138         (0x1000000) Physical length of flash mapping    //内存大小,16M,要大于实际的大小

139         (2) Bank owidth in octets                        //位宽为16位

140 2).make modules

141 cp drivers/mtd/maps/physmap.ko  /home/study/nfs_home    

142     

143                 

144 6.写驱动程序

145 ①分配

146 ②设置

147 ③使用                

148 驱动程序框架:

149 

150 7.测试   使用自己写的驱动程序

151 2.保存以前的根文件系统的bootargs

152 nfs 30000000 192.168.1.5:/work/nfs_root/uImage_nonand

153 set bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.105:/work/nfs_root/first_fs ip=192.168.1.17:192.168.1.5:192.168.1.1:255.255.255.0::eth0:off

154 

155 ls /dev/mtd*

156 insmod lhy_nor.ko

157 ls /dev/mtd*    

158 格式化: flash_eraseall -j     /dev/mtd1        ;格式化为jffs2文件系统(一般nand(yaffs),nor(jffs2))        

159 

160 挂接: mount -t jffs2 /dev/mtdblock1 /mnt      ;格式化时用字符设备,挂接时用块设备

161 在里面增加文件,重启之后,看看文件是否还在

162 insmod lhy_nor.ko

163 ls /dev/mtd*

164 mount -t jffs2 /dev/mtdblock1 /mnt           ;读文件

165 

166 

167 8.协议层追踪

168 lhy_nor_mtd = do_map_probe('cfi_probe',lhy_nor_map);

169 lhy_nor_mtd = do_map_probe('jedec_probe',lhy_nor_map);

170 

171                 

172 */


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    器内部集成了完备的硬件资源,外部存储控制器,4通道DMA,3通道的UART,2通道SPI,2通道USB主机和1通道USB设备,4通道PWM定时器和内部看门狗定时器,130个GPIO等。   NAND FLASH采用......
    等。 NAND FLASH采用K9F2G08,该存储芯片容量大,高达256 MB,改写速度非常快,易于使用,具有可靠的耐用性,适合用于大量数据存储,该FLASH以512 B为块进行读写操作,通过......
    本带来了全新的旗鱼logo,数十项新增、改进和问题修正,视频小窗播放如约而至(可在设置中开关此功能)、IE内核扩展/插件支持(可一键切换到IE内核)、新增划词搜索、划词复制、划词打开、内置Flash升级......
    干! Keil Assistant 插件安装与使用 其实在Vscode上就有专门的插件可以调用keil的接口去实现编译和下载 - Keil Assistant,这个插件只是调用keil的api,实际......
    Jlink调试S5PV210(2023-09-12)
    /article/details/46708437 测试GDB Server选择芯片型号,长按复位按键,然后点击“OK”准备连接测试连接连接成功安装zylin插件jlink调试插件,网址:http......
    Supermicro推出搭载跨多产品系列的EDSFF E3.S和E1.S存储驱动器的All-Flash服务器;Supermicro推出搭载跨多产品系列的EDSFF E3.S和E1.S存储......
    Code 安装插件在软件左侧选项中选择扩展选项,在插件市场中搜索安装 VS Code 插件如下: ARM提供 ARM 汇编代码的语法识别加亮 C/C++提供 C/C++ 的语法智能感知、加亮......
    上面开发stm32将会非常舒适。两者界面对比图 现在有一款插件可以满足以上需求--keilAssistant 1.安装插件。搜索keilAssistant,安装 2.在扩展配置里面修改keil路径......
    qwt移植到OK6410(2024-09-12)
    义了一些designer的插件,方便我们进行开发,所以需要一些Qt Designer的头文件,由于我有qt源码,所以这个还是比较好添加进去的,可是到最后又报错:说是不能连接到Designer库,我到我电脑上安装......
    、覆铜、层。 3. 掌握KiCad下载、安装和工作流程。 4.完成DC-DC转换电路的PCB layout。 5.掌握KiCad的第三方插件安装,能输出BOM文件......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>