移植linux3.7到nuc900系列開發板遇到的問題

經過移植學習linux新版本內核,大概瞭解一下內核變化。html

記錄一下移植過程當中遇到的問題或值得注意的地方。linux

1,添加一款arm9芯片的支持網絡

首先修改\arch\arm\tools\mach-types文件函數

添加一行學習

w90p950evb		MACH_W90P950EVB		W90P950EVB

同目錄下的腳本文件在編譯內核時會根據該文件生成htm

\include\generated\mach-types.hip

其中會生成相似這樣的定義:
define MACH_TYPE_W90P950EVB           1923
#ifdef CONFIG_MACH_W90P950EVB
# ifdef machine_arch_type
#  undef machine_arch_type
#  define machine_arch_type	__machine_arch_type
# else
#  define machine_arch_type	MACH_TYPE_W90P950EVB
# endif
# define machine_is_w90p950evb()	(machine_arch_type == MACH_TYPE_W90P950EVB)
#else
# define machine_is_w90p950evb()	(0)
#endif

若是配置內核的時候打開了CONFIG_MACH_W90P950EVB,cmd

machine_arch_type就等於上面定義的宏 1923。it

系統啓動時,在/arch/arm/kernel/setup.c中io

void __init setup_arch(char **cmdline_p)
{
	struct machine_desc *mdesc;

	setup_processor();
	mdesc = setup_machine_fdt(__atags_pointer);
	if (!mdesc)
		mdesc = setup_machine_tags(__atags_pointer, machine_arch_type);
	machine_desc = mdesc;
	machine_name = mdesc->name;
......

調用

setup_machine_fdt(__atags_pointer);

該函數bootloader傳過來相關參數,匹配machine type。 若是沒傳過來參數,調用

setup_machine_tags(__atags_pointer, machine_arch_type);

用1923來匹配,與之匹配的是用MACHINE_START初始化的結構體,在內核中搜索MACHINE_START……

MACHINE_START(W90P950EVB, "W90P950EVB")

第一個參數W90P950EVB經過宏會轉換成MACH_TYPE_W90P950EVB,函數經過比較這個值和machine_arch_type進行匹配。

MACHINE_START宏網絡上有詳細分析,大體就是初始化了struct machine_desc結構體並放到相應的段.

值得注意的是struct machine_desc結構體有必定的變化,

unsigned int        phys_io;    /* start of physical io    */
       unsigned int        io_pg_offst;    /* byte offset for io */

移除,

unsigned long        boot_params;    /* tagged list        */

變成了

unsigned long        atag_offset;    /* tagged list (relative) */

變換關係 

boot_params=sdram物理地址+atag_offset,即地址變成了偏移.像nuc900系列,sdram地址0x00000000這兩個值就相等.

這個值指示了bootloader傳來的參數存放位置。

 

編譯期間遇到問題:

warning: type defaults to 'int' in declaration of 'EXPORT_SYMBOL'

加頭文件 include<linux/export.h>

warning: type defaults to 'int' in declaration of 'DECLARE_MUTEX'

從linux2.6.37 DECLARE_MUTEX 已從內核移除

可用DEFINE_SEMAPHORE 替換

error: 'PAGE_SHIFT' undeclared here (not in a function)

加頭文件

#include<asm/page.h>

相關文章
相關標籤/搜索