第6课 Flash存储器和MTD驱动

时光怂恿深爱的人放手 提交于 2020-04-24 17:53:18

6.1 MTD

MTD(memory technology device内存技术设备) 在硬件和文件系统之间提供了一个抽象的接口。

6.1.1 MTD驱动

接下来,我们在uClinux下实现MTD,进入目录:cd /work/uClinux-dist/linux-2.4.x/drivers/mtd/maps

修改config.in文件:sudo gedit Config.in,在endmenu前添加一行:

dep_tristate ' CFI Flash device mapped on myboard_flash' CONFIG_MTD_MYFLASH $CONFIG_MTD_CFI,如下图:

 

保存退出。

然后再该目录下添加myflash.c文件。下面链接里有flash.c文件,直接使用。

https://pan.baidu.com/disk/home?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=#/all?vmode=list&path=%2F%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F%E8%B5%84%E6%96%99%2Flesson%2F%E8%B5%84%E6%96%99%2Flesson%206

 

在该路径下修改Makefile文件,增加obj-$(CONFIG_MTD_MYFLASH) += myflash.o,如下图

 

在路径/work/uClinux-dist/linux-2.4.x/include/linux/mtd下,修改mtd.h文件。命令:sudo gedit mtd.h

修改前:

 

修改后:

 

进入目录:/work/uClinux-dist/vendors/Marvell/Firefox,修改Makefile,命令:sudo gedit Makefile,如下图:

 

增加:

\

 mtd0,c,90,0 mtd1,c,90,2 mtd2,c,90,4 \

mtdblock0,b,30,0 mtdblock1,b,30,1 mtdblock2,b,30,2 \

如下图:

 

6.1.2 更新内核配置

接下来更新内核配置,在目录/work/uClinux-dist/下执行命令:sudo make xconfig,按照下面几幅图一步一步选。

 

保存退出以后,执行命令:sudo make,等待编译完成。

6.1.3 下载到开发板

编译完成以后,下载到开发板,具体步骤和命令就不再累述了。但是在重启开发板的时候出现了下面的问题:

 

 

具体原因是:内核太大了,内存不够用,需要将一些东西卸载。这里我选择第三节课所讲的telnet卸载:

在目录在目录/work/uClinux-dist/下执行命令:sudo make xconfig

 

保存并且退出以后,接下来按照下面的来选择,

 

保存退出。然后执行命令:sudo make。再次将它下载进入开发板。下载完成以后,重启开发板,如果还出现以上情况,那么,把NFS也卸载了,直到不在出现以上问题。

下载到开发板,成功的截图如下:

 

可以通过cat命令查看:

 

6.1.4 MTD保存配置

格式化/dev/mtdblock0

 

将/mnt文件夹挂载到/dev/mtdblock0

 

将/bin目录下的一个文件,比如newusr,复制到/mnt里,

 

然后解挂,命令:umount /mnt

重启开发板,然后然后再将/mnt文件夹挂载到/dev/mtdblock0,便是将/dev/mtdblock0里的数据传递给/mnt

然后我们检查一下/mnt里是否有newuser,

 

如上图,说明MTD配置成功。

6.2 登录用户名和密码修改

有了MTD我们要修改用户名和密码就有了思路:我们将改好的用户名和密码复制到/mnt,并将/mnt挂载到/dev/mtdblock0,再开机重启的时候,通过rc脚本命令,将/dev/mtdblock0里的数据也就是修改以后的密码传递给etc目录下覆盖之前的PsWd文件。

首先应该编写一个修改密码和用户名的程序,在/work/uClinux-dist/user/scu目录下星将一个文件newusr.c,命令:sudo gedit newusr.c

里面的内容如下:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <fcntl.h>

#include <pwd.h>

#include <getopt.h>

#include <errno.h>

#include <string.h>

#include <crypt.h>

#define PATH_PASSWD      "/etc/PsWd"    //定义存放真实用户名和密码的路径

char usernamebuf[128];

char userPswbuf[128];

int main()

   {

       FILE *fp;

       char * newuser,*newpsw;

      

       char * cryptmode = "ab";

       int i=0;

       char userinfo[128]={'u','s','e','r','='};

       char pwdinfo[128]={'p','a','s','s','w','d','='};

       if((fp = fopen(PATH_PASSWD,"w"))== NULL){

              printf("fail to create or open the file\n");

              return -1;

              }

       printf("New Nser:\n");

       fgets(usernamebuf, sizeof(usernamebuf), stdin);

       newuser=crypt(usernamebuf,cryptmode);

       for(i=0;i<sizeof(newuser);i++)

       {

              userinfo[5+i]=newuser[i];

       }

       printf("New Passwd:\n");

       fgets(userPswbuf, sizeof(userPswbuf), stdin);

       newpsw=crypt(userPswbuf,cryptmode);

       for(i=0;i<sizeof(newpsw);i++)

       {

              pwdinfo[7+i]=newpsw[i];

       }

       fputs(userinfo,fp);

       fputs("\n",fp);

       fputs(pwdinfo,fp);                    

       fclose(fp); 

       return 0;

   }

 

修改Makefile

EXEC = newusr

OBJS = newusr.o

all: $(EXEC)

$(EXEC): $(OBJS)

       $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

romfs:

       $(ROMFSINST) /bin/$(EXEC)

clean:

       -rm -f $(EXEC) *.elf *.gdb *.o

然后,到目录:/work/uClinux-dist/vendors/Marvell/Firefox下执行命令:sudo gedit rc

在文件尾添加:

 

意思为:将保存的PsWd数据传递给/etc下,这样在开机启动的时候数据就复制到PsWd里了,用户名和密码就是修改的值了。

到目录/work/uClinux-dist下执行命令:sudo make

编译完成后,将程序下载到开发板。

重启,此时我们还没有执行修改密码和用户名的程序,所以,程序还是执行初始时设置的用户名和密码,

到/bin目录下执行newusr程序,命令:./newusr

如上设置新的用户名和密码,并回车,将新的数据保存到PsWd文件里,

然后,格式化/dev/mtdblock0

 

将/mnt文件夹挂载到/dev/mtdblock0

 

将/etc目录下的一个文件,比如newusr,复制到/mnt里,

/>cp /etc/PsWd /mnt

然后解挂,命令:umount /mnt,将数据全部传输到mtdblock0里面,

重启开发板。

此时输入新的用户名和密码就可以登录进去了。

6.3 总结

这节课的内容不算多,但是不好理解,尤其是MTD的问题,利用好MTD做一个登陆程序用户名和密码的修改让我做到心态爆炸,多亏了同学的帮助才理解了一点,希望接下来能够做的更完善。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!