很久沒有關心linux內核版本的,現在已經出到了3.4.4,3.5的穩定版本也快出了
決定將XC2440的2.6.37版本升級到linux-3.4.4。原來移植linux3是如此容易,驅動架構基本上沒有變,可以直接從linux2.6.37上過渡,1個小時就搞定
總結一下和2.6.37內核的區別和移植過程中遇到的問題及解決辦法
1. bsp
board file都放到了arch/arm/mach-s3c24xx目錄下,把mach-xc2440.c也放到這裡
同目錄的Kconfig: 按CPU排序,所有的Board選項都集成在一個菜單下
board file中MACHINE_START將.boot_params 替換成 .atag_offset,
加了.restart = s3c244x_restart(在common.h中定義)
2. yaffs:
在struct mtd_info中的接口函數變成的以下劃線開頭的,需要把調用mtd操作函數的地方修改函數名。 如mtd->read --> mtd->_read
只有3個文件會報錯,yaffs_vfs.c yaffs_mtdif1.c yaffs_mtdif2.c
yaffs_vfs.c: 會提示“向只讀成員‘i_nlink’賦值”
查看inode結構體裡面有一個聯合體,i_nlink是const類型的
struct inode union {
const unsigned int i_nlink;
unsigned int __i_nlink;
};
所以要用__i_nlink,把代碼中的i_nlink都替換了
root = d_alloc_root(inode); 提示這行的d_alloc_root函數沒有聲明
查看dache.c中這個函數已經改為了d_make_root
yaffs_mtdif1.c: ‘MTD_OOB_AUTO’未聲明
看老版內核的mtd.h中的enum mtd_oob_mode_t沒有了
有個struct mtd_oob_ops,看上面的注釋裡有MTD_OPS_RAW
搜這個是在mtd-eabi.h定義的
enum {
MTD_OPS_PLACE_OOB = 0,
MTD_OPS_AUTO_OOB = 1,
MTD_OPS_RAW = 2,
};
所以把MTD_OOB_AUTO改成MTD_OPS_AUTO_OOB
yaffs_mtdif2.c和yaffs_mtdif1.c修改的地方一樣
XC2440上移植的驅動見這裡:http://www.linuxidc.com/Linux/2012-07/64307.htm