第6課 Flash存儲器和MTD驅動

6.1 MTD

MTD(memory technology device內存技術設備) 在硬件和文件系統之間提供了一個抽象的接口。linux

6.1.1 MTD驅動

接下來,咱們在uClinux下實現MTD,進入目錄:cd /work/uClinux-dist/linux-2.4.x/drivers/mtd/mapsapp

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

dep_tristate ' CFI Flash device mapped on myboard_flash' CONFIG_MTD_MYFLASH $CONFIG_MTD_CFI,以下圖:spa

 

保存退出。3d

而後再該目錄下添加myflash.c文件。下面連接裏有flash.c文件,直接使用。blog

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開發

修改前:get

 

修改後:

 

進入目錄:/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作一個登錄程序用戶名和密碼的修改讓我作到心態爆炸,多虧了同窗的幫助才理解了一點,但願接下來可以作的更完善。

相關文章
相關標籤/搜索