第6課 Flash存儲器和MTD驅動


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做一個登陸程序用戶名和密碼的修改讓我做到心態爆炸,多虧了同學的幫助才理解了一點,希望接下來能夠做的更完善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM