LINUX-2.6.31內核移植及添加驅動

LINUX-2.6.31內核移植及添加驅動  

2010-08-04 12:09:41|  分類: Linux系統 |  標籤:內核  support  device  mach  drivers   |字號 訂閱 node

默認分類 2010-07-30 11:36:15 閱讀16 評論0 字號: linux


詳細參見:內核LINUX-2.6.31移植手冊ios

2010-07-30git

內核版本:
Linux-2.6.31
交叉編譯器版本:
arm-linux-gcc  4.1.2
操做系統平臺:
Linux  --  Red  Hat  9.0
開發板平臺:
Arm  --  2440web

一>  準備移植 網絡

得到內核源碼:
Linux-2.6.31.tar.bz2
也可到官方網站http://www.kernel.org/得到最新版本的內核源碼
解壓源碼,進入目錄:
#tar  xjvf  linux-2.6.31.bz2
#cd  linux-2.6.31
修改  Makefile:    183 行:
ARCH  ?=  arm
CROSS_COMPILE  ?=  arm-linux-
?指定系統硬件架構
?指定交叉編譯器
修改時鐘:
修改 arch/arm/mach-s3c2440/mach-smdk2440.c
static  void  __init  smdk2440_map_io(void)
{
163 行
s3c24xx_init_io(smdk2440_iodesc,  ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);       ?輸入時鐘爲 12MHz
s3c24xx_init_uarts(smdk2440_uartcfgs,  ARRAY_SIZE(smdk2440_uartcfgs));
}
這個必定要設置對,不然會打印出亂碼。
修改機器碼(根據實際狀況,這個要和 bootloader 的匹配):
修改:arch/arm/tools/mach-types     379 行:
s3c2440    技技技技         XXX       後面那個數就是機器碼
配置:
#make  menuconfig
?進入圖形化配置界面
在配置菜單中選擇這一項:"Load  an  Alternate  Configuration  File"
輸入 2440 的默認配置文件:arch/arm/configs/s3c2410_defconfig
說明:這個文件就是 S3C24XX 系列開發板的板級支持包(BSP)
而後選擇 OK,按回車
進入"System  Type"選項單,裏面的選項保持默認
在"S3C24XX  Machine"選項中只配置這幾項(其餘的選項取消): 架構

S3C2410  Machine  --->
[*]  SMDK2410/A9M2410
S3C2440  Machine  --->
[*]  SMDK2440
[*]  SMDK2440  with  S3C2440  cpu  moudle
配置完後,回到主菜單,選擇這一項"Save  an  Alternate  Configuration  File"
輸入要保存的配置文件名稱:.config  (默認)  或本身取名:TX2440A_config
退出,編譯內核:  #make  zImage
說明:之後移植過程當中的配置、編譯,都是按這個步驟進行,可是隻須要保存
一次配置文件,之後就不須要再保存配置文件了,配置完後能夠直接退出。
編譯完後,會在 arch/arm/boot 下生成 zImage 內核鏡像文件
能夠修改該目錄下的 Makefile:    在第 57 行下面添加:
@cp  -f  arch/arm/boot/zImage  zImage
@echo  `  Kernel:  $@  is  ready`
這樣執行 make  zImage 後,就把生成的 zImage 拷到內核根目錄下
若是但願在在執行 make  distclean 時,也同時把 zImage 刪除,
能夠修改內核源碼目錄下 Makefile 的第 1247 行,在後面加上:
-type  f  -print  |  xargs  rm  -f  rm  zImage
把 zImage 鏡像燒進 NandFlash 跑一下,看是否正常打印出信息
若是第一步能正常引導內核,那就開始進行第二步,添加驅動
注意,系統啓動最後可能會出現這個錯誤:
Kernel  panic  -  not  syncing:  Attempted  to  kill  init!
而後出打印出一些很亂的東西。
由於用 4.X.X 版本的交叉編譯器使用 EABI,但內核默認是不支持 EABI 編譯的,因此
編譯出的系統會報錯,但用 3.X.X 版本的編譯器就不會出現這個問題。
解決辦法是,配置內核支持 EABI 編譯
Kernel  Features    --->
[*]  Use  the  ARM  EABI  to  compile  the  kernel
[*]
(EXPERIMENTA)
Allow   old   ABI   binaries   to   run   with   this   kernel app

二>  支持 NandFlash: ide

修改:arch/arm/plat-s3c24xx/common-smdk.c 文件,在第 110 行:
這裏咱們要使 nandflash 同時支持 64M,256M 或更高容量。
static  struct  mtd_partition  smdk_default_nand_part[]  =  {
#if  defined(CONFIG_64M_NAND)
[0]  =  {
.name    =  "boot",
.offset      =  0,
.size    =  SZ_1M,
},
[1]  =  {
.name    =  "kernel",
.offset  =  SZ_1M  +  SZ_128K,
.size    =  SZ_4M,
},
[2]  =  {
.name    =  "yaffs2",
.offset  =  SZ_1M  +  SZ_128K  +  SZ_4M,
.size    =  SZ_64M  -  SZ_4M  -  SZ_1M  -  SZ_128K,
}
#elif  defined(CONFIG_256M_NAND)
[0]  =  {
.name    =  "boot",
.offset      =  0,
.size    =  SZ_1M,
},
[1]  =  {
.name    =  "kernel",
.offset  =  SZ_1M  +  SZ_128K,
.size    =  SZ_4M,
},
[2]  =  {
.name    =  "yaffs2",
.offset  =  SZ_1M  +  SZ_128K  +  SZ_4M,
.size    =  SZ_256M  -  SZ_4M  -  SZ_1M  -  SZ_128K, 函數

}
#endif
};
這個分區名字能夠隨便起。
接下來修改  Nand  讀寫匹配時間,這個改不改應該問題都不大,我認爲是根據  Nand
的讀寫特性相關的,也就是查芯片資料獲得的值,每種 Nand 的值都不同,仍是在
這個文件中第 140 行:
static  struct  s3c2410_platform_nand  smdk_nand_info  =  {
.tacls
.twrph0
.twrph1
=  10,
=  25,
=  10,
.nr_sets    =  ARRAY_SIZE(smdk_nand_sets),
.sets          =  smdk_nand_sets,
};
修改 Kconfig 文件,在配置時選擇 NAND 類型,修改 driver/mtd/nand/Kconfig,在
172 行,添加:
choice
prompt  "Nand  Flash  Capacity  Select"
depends  on  MTD
config  64M_NAND
boolean  "64M  NAND  For  TX-2440A"
depends  on  MTD
config  256M_NAND
boolean  "256M  NAND  For  TX-2440A"
depends  on  MTD
endchoice
配置內核,支持 NandFlash
Device  Drivers  --->
<*>  Memory  Technology  Device  (MTD)  support  --->

[*]     MTD  partitioning  support
<*>  NAND  Device  Support  --->
<*>     NAND  Flash  support  for  S3C2410/S3C2440  SoC
[*]       S3C2410  NAND  Hardware  ECC         //這個必定要選上
Nand  Flash  Capacity  Select(256M  Nand  For  TX-2440A)--->
啓動時輸出:
S3C24XX  NAND  Driver,  (c)  2004  Simtec  Electronics
s3c24xx-nand  s3c2440-nand:  Tacls=1,  10ns  Twrph0=3  30ns,  Twrph1=1  10ns
s3c24xx-nand  s3c2440-nand:  NAND  hardware  ECC
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V
8-bit)
Scanning  device  for  bad  blocks
Creating  3  MTD  partitions  on  "NAND  256MiB  3,3V  8-bit":
0x000000000000-0x000000100000  :  "boot"
0x000000120000-0x000000520000  :  "kernel"
0x000000520000-0x000010000000  :  "yaffs2"
三>  支持 yaffs2 文件系統

下載 yaffs2 源碼(在光盤資料/源碼包/其餘軟件源碼/目錄下)
解壓,進入 yaffs2 目錄:
#tar  xzvf  yaffs2.tar.gz
#cd  cvs/yaffs2/
給內核打上 yaffs2 文件系統的補丁,執行:
#./patch-ker.sh  c  /技/linux-2.6.31/     ?這個是你的內核源碼的目錄

這時內核源碼 fs 目錄下多了一個 yaffs2 目錄,同時 Makefile 文件和 Kconfig
文件也增長了 yaffs2 的配置和編譯條件。

配置對 yaffs2 支持:
這部分配置的比較多,可根據本身的須要進行配置,把不用的文件系統都去掉,
下面是幾個主要的配置:
File  systems  --->
DOS/FAT/NT  Filesystems  --->
<*>  MSDOS  fs  support

<*>  VFAT  (Windows95)  fs  support
Miscellaneous  filesystems  --->
<*>  YAFFS2  file  system  support
[*]  Autoselect  yaffs2  format
配置語言選項:
Native  Language  support  --->
(iso8859-1)  Default  NLS  Option
<*>  Codepage  437(United  States,  Canada)
<*>  Simplified  Chinese  charset(CP936,  GB2312)
<*>  NLS  ISO8859-1  (Latin  1;  Western  European  Language)
<*>  NLS  UTF-8
說明:如今內核已經支持 NandFlash 和 yaffs2 文件系統,將內核燒入 NandFlash
後,再燒入 yaffs2 文件系統,可使用製做好的文件系統,也能夠本身製做,詳細
的製做文件系統方法,請查看《文件系統製做手冊》
啓動時(成功掛載文件系統)輸出:
yaffs:  dev  is  32505858  name  is  "mtdblock2"
yaffs:  passed  flags  ""
yaffs:  Attempting  MTD  mount  on  31.2,  "mtdblock2"
yaffs:  auto  selecting  yaffs2
yaffs_read_super:  isCheckpointed  0
VFS:  Mounted  root  (yaffs  filesystem)  on  device  31:2.
Freeing  init  memory:  196K
四>  LCD 驅動的移植

內核裏已經有很完善的 LCD 驅動了,只要根據所用的 LCD 進行簡單的修改,在
內核源碼 drivers/video/s3c2410fb.c 是 LCD 驅動的源碼,首先要設置 LCD 的時鐘
頻率,有一個計算公式,很複雜,不用管它,直接修改程序實現。

在第 365 行開始的函數:
static  void  s3c2410fb_activate_var(struct  fb_info  *info)
{

struct  s3c2410fb_info  *fbi  =  info->par;
void  __iomem  *regs  =  fbi->io;
int  type  =  fbi->regs.lcdcon1  &  S3C2410_LCDCON1_TFT;
struct  fb_var_screeninfo  *var  =  &info->var;
struct  s3c2410fb_mach_info  *mach_info  =  fbi->dev->platform_data;
struct   s3c2410fb_display   *default_display   =   mach_info->displays   +
mach_info->default_display;
int  clkdiv  =  s3c2410fb_calc_pixclk(fbi,  var->pixclock)  /  2;
dprintk("%s:  var->xres    =  %d\n",  __func__,  var->xres);
dprintk("%s:  var->yres    =  %d\n",  __func__,  var->yres);
dprintk("%s:  var->bpp     =  %d\n",  __func__,  var->bits_per_pixel);
if  (type  ==  S3C2410_LCDCON1_TFT)  {
s3c2410fb_calculate_tft_lcd_regs(info,  &fbi->regs);
--clkdiv;
if  (clkdiv  <  0)
clkdiv  =  0;
}  else  {
s3c2410fb_calculate_stn_lcd_regs(info,  &fbi->regs);
if  (clkdiv  <  2)
clkdiv  =  2;
}
//   fbi->regs.lcdcon1  |=    S3C2410_LCDCON1_CLKVAL(clkdiv);
fbi->regs.lcdcon1  |=
S3C2410_LCDCON1_CLKVAL(default_display->setclkval);
這幾句是在 s3c2410fb_display 結構體中加入了 setclkval 變量,咱們須要在結構
體原型中加入這個變量,在 arch/arm/mach-s3c2410/include/mach/fb.h 中第 40 行
加入:unsigned  setclkval;    /*clkval*/
說明:在視頻教程中修改 s3c2410fb.c 文件時,和手冊上有一點偏差,手冊上寫的
是正確的,請按照手冊上操做
修改 LCD 參數配置:(這個要查看所用 LCD 的手冊來肯定參數)
修改 arch/arm/mach-s3c2440/mach-smdk2440.c 中第 107 行的結構體,我修改的參

數以下:
static  struct  s3c2410fb_display  smdk2440_lcd_cfg  __initdata  =  {
.lcdcon5    =  S3C2410_LCDCON5_FRM565  |
S3C2410_LCDCON5_INVVLINE  |
S3C2410_LCDCON5_INVVFRAME  |
S3C2410_LCDCON5_PWREN  |
S3C2410_LCDCON5_HWSWP,
.type
=  S3C2410_LCDCON1_TFT,
.width
.height
=  320,
=  240,
.pixclock   =  100000,  /*  HCLK  60  MHz,  divisor  10  */
.setclkval    =  0x3,    /*add  by  xgc*/
.xres
.yres
.bpp
=  320,
=  240,
=  16,
.left_margin    =  19,
.right_margin  =  24,
.hsync_len =  44,
.upper_margin  =  7,
.lower_margin  =  5,
.vsync_len =  15,
};
屏蔽掉第 150 行的語句:
//   .lpcsel            =  ((0xCE6)  &  ~7)  |  1<<4,
配置內核,支持 LCD:
Device  Drivers:
Graphics  Support    --->
<*>support  for  frame  buffer  devices  --->
[*]  Enable  frameware  EDID
[*]  Enable  Vidoe  Mode  Handling  Helpers

11

<*>  S3C24X0  LCD  framebuffer  support
Console  display  driver  support  --->
<*>  Framebuffer  Console  Support
[*]  Bootup  Logo  --->
<*>  Standard  224-color  Linux  logo
啓動時輸出:
Console:  switching  to  colour  frame  buffer  device  40x30
fb0:  s3c2410fb  frame  buffer  device
添加對 7 寸 LCD 的支持:
咱們使用的 7 寸屏是羣創的 AT070TN83  V.1(帶觸摸屏),分辨率是 800X480。
一樣修改 arch/arm/mach-s3c2440/mach-smdk2440.c 中第 107 行的結構體,加入 7
寸屏的配置參數:
static  struct  s3c2410fb_display  smdk2440_lcd_cfg  __initdata  =  {
.lcdcon5    =  S3C2410_LCDCON5_FRM565  |
S3C2410_LCDCON5_INVVLINE  |
S3C2410_LCDCON5_INVVFRAME  |
S3C2410_LCDCON5_PWREN  |
S3C2410_LCDCON5_HWSWP,
.type
=  S3C2410_LCDCON1_TFT,
#if  defined(CONFIG_FB_S3C2410_W35)
.width
.height
=  320,
=  240,
.pixclock   =  100000,  /*  HCLK  60  MHz,  divisor  10  */
.setclkval    =  0x3,    /*add  by  xgc*/
.xres
.yres
.bpp
=  320,
=  240,
=  16,
.left_margin    =  19,
.right_margin  =  24,
12

.hsync_len =  44,
.upper_margin  =  7,
.lower_margin  =  5,
.vsync_len =  15,
#elif  defined(CONFIG_FB_S3C2410_Q70)
.width
.height
=  800,
=  480,
.pixclock   =  40000,  /*  HCLK  40  MHz*/
.setclkval    =  0x1,    /*add  by  xgc*/
.xres
.yres
.bpp
=  800,
=  480,
=  16,
.left_margin    =  40,  /*HFPD*/
.right_margin  =  40,  /*HBPD*/
.hsync_len =  48,  /*HSPW*/
.upper_margin  =  13,  /*VFPD*/
.lower_margin  =  29,  /*VBPD*/
.vsync_len =  3,  /*VSPW*/
#endif
};
修改 drivers/video/Kconfig 文件,在 1942 行加入:
choice
prompt  "LCD  size  select"
depends  on  FB_S3C2410
help
s3c2410  lcd  size  select
config  FB_S3C2410_W35
boolean"The  3.5  inch  LCD  with  resolution  320X240"
depends  on  FB_S3C2410
help
3.5  inch  LCD  320X240

13

config  FB_S3C2410_Q70
boolean"The  7  inch  LCD  with  resolution  800X480"
depends  on  FB_S3C2410
help
7  inch  LCD  800X480
endchoice
config  FB_S3C2410_DEBUG
bool  "S3C2410  lcd  debug  messages"
depends  on  FB_S3C2410
help
Turn  on  debugging  messages.  Note  that  you  can  set/unset  at  run  time
through  sysfs
配置內核,支持 7 寸 LCD:
Device  Drivers:
Graphics  Support    --->
<*>support  for  frame  buffer  devices  --->
<*>  S3C24X0  LCD  framebuffer  support
LCD  size  select(The  3.5  inch  LCD  with  resolution  320X240)  --->
進入"LCD size select(The 3.5 inch LCD with resolution 320X240)--->"選項,
在這裏選擇不一樣的 LCD 類型(默認的是 3.5 寸屏),按空格鍵便可選中,前面有"X"
的表示選中的,若是咱們要選擇  7  寸屏,將光標移至第二行,按空格鍵,就選中了
對 7 寸屏的支持
(  )The  3.5  inch  LCD  with  resolution  320X240
(X)The  7  inch  LCD  with  resolution  800X480
五>  DM9000 驅動的移植

修改 arch/arm/mach-s3c2440/mach-smdk2440.c    158行
Platform_device 結構體中,加入:
&s3c_device_dm9000,

修改 arch/arm/plat-s3c24xx/devs.c  在最前面 38 行加入:

 

#include  <linux/dm9000.h>    //別忘加這個頭文件
/*DM9000*/
static  struct  resource  s3c_dm9000_resource[]  =  {
[0]  =  {
.start  =  S3C2410_CS4,
.end     =  S3C2410_CS4  +  3,
.flags  =  IORESOURCE_MEM,
},
[1]  =  {
.start  =  S3C2410_CS4  +  4,
.end     =  S3C2410_CS4  +  4  +  3,
.flags  =  IORESOURCE_MEM,
},
[2]  =  {
.start  =  IRQ_EINT18,    /*use  eint18  GPG10*/
.end     =  IRQ_EINT18,
.flags  =  IORESOURCE_IRQ,
}
};
static  struct  dm9000_plat_data  s3c_dm9000_platdata  =  {
.flags     =  DM9000_PLATF_16BITONLY,
};
static  struct  platform_device  s3c_device_dm9000  =  {
.name  =  "dm9000",
.id  =  0,
.num_resources  =  ARRAY_SIZE(s3c_dm9000_resource),
.resource  =  s3c_dm9000_resource,
.dev         =  {
.platform_data  =  &s3c_dm9000_platdata,
}
};
EXPORT_SYMBOL(s3c_device_dm9000);
在 arch/arm/plat-s3c/include/plat/devs.h 中加入一行:
extern  struct  platform_device  s3c_device_dm9000;
編譯時出現一個奇怪的錯誤:
arch/arm/plat-s3c24xx/devs.c:63:
error:
static
declaration
of
's3c_device_dm9000'  follows  non-static  declaration
arch/arm/plat-s3c/include/plat/devs.h:27:  error:  previous  declaration  of
's3c_device_dm9000'  was  here
s3c_device_dm9000 首先在 devs.c 中定義,在 devs.h 中聲明,在 mach-s3c2440.c
中使用,看了好幾遍代碼,應該沒什麼問題。查不到什麼緣由,我以爲是跟編譯器
有關,在 devs.c 中作了一下修改,問題解決,編譯時只出現一個 warning
把 devs.c 中的這句:
static  struct  platform_device  s3c_device_dm9000  =  {
的 static 改爲 extern,就能夠了
************************************************************************************************************************************************************************************
下面修改 dm9000.c 源碼,在 drivers/net/dm9000.c 中
1.  添加頭文件,在第 43 行加入:
#if  defined(CONFIG_ARCH_S3C2410)
#include  <mach/regs-mem.h>
#endif
2.  指定註冊時的中斷觸發方式,在第 1019 行加入:
static  int  dm9000_open(struct  net_device  *dev)
{
????
irqflags  |=  IRQF_SHARED;
#if  defined  (CONFIG_ARCH_S3C2410)
if(request_irq(dev->irq,&dm9000_interrupt,IRQF_SHARED|IRQF_TRIGGER_RISING,dev->name,dev))
#else
if(request_irq(dev->irq,&dm9000_interrupt,IRQF_SHARED,dev->name,dev))
#endif
//if   (request_irq(dev->irq,   &dm9000_interrupt,   irqflags,   dev->name, dev))
return  -EAGAIN;
????
}
3.  設置 BANK4,  設置 MAC 地址,在 1215 行,dm9000_probe 函數中加入:
int  ret  =  0;
int  iosize;
int  i;
u32  id_val;
#if  defined(CONFIG_ARCH_S3C2410)
unsigned  int  oldval_bwscon  =  *(volatile  unsigned  int  *)S3C2410_BWSCON;
unsigned      int      oldval_bankcon4      =      *(volatile      unsigned      int *)S3C2410_BANKCON4;
#endif
/*  Init  network  device  */
ndev  =  alloc_etherdev(sizeof(struct  board_info));
if  (!ndev)  {
dev_err(&pdev->dev,  "could  not  allocate  device.\n");
return  -ENOMEM;
}
在 1231 行加入:
SET_NETDEV_DEV(ndev,  &pdev->dev);
dev_dbg(&pdev->dev,  "dm9000_probe()\n");
#if  defined(CONFIG_ARCH_S3C2410)
*((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<16)) |  S3C2410_BWSCON_DW4_16  |  S3C2410_BWSCON_WS4  |  S3C2410_BWSCON_ST4;
*((volatile  unsigned  int  *)S3C2410_BANKCON4)  =  0x1f7c;
#endif

在 1390 行加入:
db->mii.mdio_read
=  dm9000_phy_read;
db->mii.mdio_write     =  dm9000_phy_write;
#if  defined(CONFIG_ARCH_S3C2410)
printk("Now  use  the  default  MAC  address:  08:90:90:90:90:90  ");
mac_src  =  "www.txmcu.com";
ndev->dev_addr[0]  =  0x08;
ndev->dev_addr[1]  =  0x90;
ndev->dev_addr[2]  =  0x90;
ndev->dev_addr[3]  =  0x90;
ndev->dev_addr[4]  =  0x90;
ndev->dev_addr[5]  =  0x90;
#else
mac_src  =  "eeprom";
/*  try  reading  the  node  address  from  the  attached  EEPROM  */
for  (i  =  0;  i  <  6;  i  +=  2)
dm9000_read_eeprom(db,  i  /  2,  ndev->dev_addr+i);
if  (!is_valid_ether_addr(ndev->dev_addr)  &&  pdata  !=  NULL)  {
mac_src  =  "platform  data";
memcpy(ndev->dev_addr,  pdata->dev_addr,  6);
}
if  (!is_valid_ether_addr(ndev->dev_addr))  {
/*  try  reading  from  mac  */
mac_src  =  "chip";
for  (i  =  0;  i  <  6;  i++)
ndev->dev_addr[i]  =  ior(db,  i+DM9000_PAR);
}
if  (!is_valid_ether_addr(ndev->dev_addr))
dev_warn(db->dev,  "%s:  Invalid  ethernet  MAC  address.  Please  "


"set  using  ifconfig\n",  ndev->name);
#endif
platform_set_drvdata(pdev,  ndev);
ret  =  register_netdev(ndev);
if  (ret  ==  0)
printk(KERN_INFO  "%s:  dm9000%c  at  %p,%p  IRQ  %d  MAC:  %pM  (%s)\n",
ndev->name,  dm9000_type_to_char(db->type),
db->io_addr,  db->io_data,  ndev->irq,
ndev->dev_addr,  mac_src);
return  0;
out:
#if  defined(CONFIG_ARCH_S3C2410)
*(volatile  unsigned  int  *)S3C2410_BWSCON  =  oldval_bwscon;
*(volatile  unsigned  int  *)S3C2410_BANKCON4  =  oldval_bankcon4;
#endif
配置內核,支持網卡:
Device  Drivers  --->
[*]  Network  device  support  --->
[*]  Ethernet(10  or  100  Mbit)  --->
<*>  DM9000  support
(4)  DM9000  maximum  debug  level
啓動時輸出:
dm9000  Ethernet  Driver,  V1.31
Now  use  the  default  MAC  address:  08:90:90:90:90:90
eth0:  dm9000e  at  c881c000,c8820004  IRQ  62  MAC:  08:90:90:90:90:90
系統啓動後,可能會出現這個錯誤:
ifconfig:  SIOCSIFFLAGS:  Cannot  assign  requested  address
緣由是 MAC 地址沒有設置或沒有設置對,在啓動腳本(/etc/init.d/rcS)中加上:
ifconfig  eth0  down
ifconfig  eth0  hw  ether  XX:XX:XX:XX:XX:XX    ?MAC 地址,隨便設

19

ifconfig  eth0  up
通常問題能夠解決,若是還提示有錯,再改一下 MAC 地址
測試網卡的方法:鏈接好計算機和開發板之間的網線,若是網開發板網卡的燈亮起,
說明已經鏈接到計算機;
能夠在計算機的命令行窗口下(開始->運行->cmd)使用 PING 命令測試網絡:
ping  192.168.1.10    ?開發板的 IP 地址
也能夠在開發板的串口終端下 PING 計算機的網卡
六>  UDA1341 聲卡驅動的移植:

硬件接法:L3MODE  ->  GPB2     L3DATA->GPB3     L3CLOCK->GPB4

內核自帶的聲卡驅動,能夠正常編譯,也會打印出正確的配置信息,可是播放
時沒有聲音,也不能進行錄音。要替換掉內核自帶的驅動(注意先備份),用 2.6.29.4
內核中的聲卡驅動
將    2.6.29.4    內  核  源  碼  (  光  盤  資  料  ->  源  碼  包  ->kernel    源  碼
->linux-2.6.29.4.tar.bz2)目錄下的:
sound 文件夾,
include/sound 文件夾,
include/asm-arm/plat-s3c24xx 文件夾,
arch/arm/mach-s3c2410/include/mach/audio.h 文件
複製到 2.6.31 內核源碼的相應目錄下,

聲卡驅動的移植步驟和 DM9000 的移植大致相同

修改 arch/arm/mach-s3c2440/mach-smdk2440.c    161 行
Platform_device 結構體中,加入:
&s3c24xx_uda134x,

修改 arch/arm/plat-s3c24xx/devs.c,在 DM9000 那段代碼下面加入:
static  struct  s3c24xx_uda134x_platform_data  s3c24xx_uda134x_data  =  {
.l3_clk  =  S3C2410_GPB(4),
.l3_data  =  S3C2410_GPB(3),
.l3_mode  =  S3C2410_GPB(2),

.model  =  UDA134X_UDA1341,
};
extern  struct  platform_device  s3c24xx_uda134x  =  {
.name =  "s3c24xx_uda134x",
.dev  =  {
.platform_data =  &s3c24xx_uda134x_data,
}
};
EXPORT_SYMBOL(s3c24xx_uda134x);
在 arch/arm/plat-s3c/include/plat/devs.h 中加入一行:
extern  struct  platform_device  s3c24xx_uda134x;
注意:編譯時會出錯,提示 S3C2410_GPBX,UDA134X_UDA1341,l3_mode 等沒有定義,
這裏須要在 devs.c 中包含兩個頭文件
#include  <mach/regs-gpio.h>     //這個是 S3C2410 的 GPIO 定義
#include  <sound/s3c24xx_uda134x.h>
配置內核,支持聲卡:
Device  Drivers:
*  Sound  card  support  ?
*  Advanced  Linux  Sound  Architecture?
*  CCS  Mixer  API
*  CSS  PCM(digital  audio)  API
*  Verbose  procfs  contents
*  ALSA  for  SoC  audio  support?
*  SoC  audio  for  the  Samsung  S3C24XX  chips
*  SoC  I2S  Audio  support  for  UDA134X  wired  to  a  S3C24XX
編譯內核,會報錯:
Sound/core/info.c:159:error:'struct  proc_dir_entry'has  no  member  named
'owner'
Sound/core/info.c:982:error:'struct  proc_dir_entry'has  no  member  named
'owner'

在 include/linux/proc_fs.h 文件中定義這個結構體成員,在第 70 行加入:
struct  module  *owner;
繼續編譯,又會出現一個錯誤:
Sound/soc/s3c24xx/s3c24xx-i2s.c:407:error:implicit declaration of function
's3c2410_gpio_cfgpin'
在 2.6.31 內核中,s3c2410_gpio_cfgpin 是在 include/linux/gpio.h 中定義的,要
添加這個文件
在 sound/soc/s3c24xx/s3c24xx-i2s.c 中,第 24 行添加:
#include  <linux/gpio.h>
繼續編譯,又會出現不少錯誤:
sound/soc/s3c24xx/s3c24xx-pcm.c  中的  S3C2410_DISRCC_INC  等常量沒有定義,
s3c2410_dam_config 函數的參數個數不對
緣由是 2.6.31 內核中 dma 相關的文件改變了,之前的跟 dma 有關的代碼就不能使用
了,咱們只需把原來代碼中的  sound/soc/s3c24xx/s3c24xx-pcm.c  這個文件替換回
來就能夠了。
編譯時一樣會出現和 DM9000 同樣的錯誤,解決方法也是把
static  struct  platform_device  s3c24xx_uda134x  =  {
(static 改爲 extern)
若是沒有問題了,啓動時會打印出如下信息:
Advanced  Linux  Sound  Architecture  Driver  Version  1.0.18a.
No  device  for  DAI  UDA134X
No  device  for  DAI  s3c24xx-i2s
S3C24XX_UDA134X  SoC  Audio  driver
UDA134X  SoC  Audio  Codec
asoc:  UDA134X  <->  s3c24xx-i2s  mapping  ok
ALSA  device  list:
#0:  S3C24XX_UDA134X  (UDA134X)
前面兩句不用管,只要後面的信息都打出來就 OK 了,能夠在源碼下把這兩條警告給
屏蔽掉
下面測試一下聲卡,設備名稱爲:/dev/dsp

用命令:  #cat  /dev/dsp  >  /tmp/1.wav  進行錄音,錄完後 Ctrl+C
用命令:#cat  /tmp/1.wav  >  /dev/dsp  進行放音,若是聽到剛纔的錄音,就說明聲
卡好使了,再用 madplay 測試一下音質,通常都沒什麼問題。
**********************************************************************************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************************************************************************

七>  SD 卡驅動移植:

內核自帶 SD 卡驅動,在 drivers/mmc/目錄下
在 arch/arm/mach-s3c2440/mach-smdk2440.c    plat_device 結構體中加入:
&s3c_device_sdi,
修改 drivers/mmc/host/s3cmci.c     在 1335 行加入
host->irq_cd  =  IRQ_EINT16;
s3c2410_gpio_cfgpin(S3C2410_GPG(8),  S3C2410_GPG8_EINT16);
這兩句指定 SD 的中斷爲 EINT16

修改同文件,屏蔽掉 1358-1359 行:
if  (s3c2410_dma_request(S3CMCI_DMA,  &s3cmci_dma_client,  NULL)  <  0)  {
dev_err(&pdev->dev,  "unable  to  get  DMA  channel.\n");
 //   ret  =  -EBUSY;
 //   goto  probe_free_irq_cd;
}
再將 1147-1148 行輸出的多餘信息屏蔽掉:
if  ((ios->power_mode  ==  MMC_POWER_ON)  ||
(ios->power_mode  ==  MMC_POWER_UP))  {

//  dbg(host,  dbg_conf,  "running  at  %lukHz  (requested:  %ukHz).\n",
//  host->real_rate/1000,  ios->clock/1000);
}  else  {
dbg(host,  dbg_conf,  "powered  down.\n");
}
配置內核,支持 SD:
Device  Drivers  --->
<*>  MMC/SD/SDIO  card  support  --->
<*>  MMC  block  device  driver
<*> Use  bounce  buffer  for  simple  hosts

<*>  Sumsung  S3C  SD/MMC  Card  Interface  support
啓動時輸出:
s3c2440-sdi  s3c2440-sdi:  powered  down.
s3c2440-sdi  s3c2440-sdi:  initialisation  done.
s3c2440-sdi  s3c2440-sdi:  powered  down.
掛載 SD 卡:
插入 SD 卡後,會提示:
mmc0:  new  SD  card  at  address  b368
mmcblk0:  mmc0:b368  SD
mmcblk0:  p1
970  MiB
那麼 SD 卡的設備名稱就是 mmcblk0p1,將它掛載到/mnt/sd  目錄下:
#mount  /dev/mmcblk0p1  /mnt/sd
進入/mnt/sd 目錄就能夠查看 SD 卡中的內容了。
卸載 SD 卡,用命令:
#umount  /mnt/sd
八>  RTC 驅動移植:

內核源碼自帶 RTC 驅動,在 arch/arm/mach-s3c2440/mach-smdk2440.c 中添加
RTC 設備,在 plat_device 結構體中加入:
&s3c_device_rtc,

配置內核,支持 RTC:
Device  Drivers  --->
<*>Real  Time  Clock  --->
[*]Set  system  time  from  RTC  on  startup  and  resume
(rtc0)  rtc  used  to  set  the  system  time
[*]/sys/class/rtc/rtcN(sysfs)
[*]/proc/driver/rtc(procfs  for  rtc0)
[*]/dev/rtcN(character  drivers)
<*>Samsung  S3C  series  SoC  RTC
啓動時輸出:
S3C24XX  RTC,  (c)  2004,2006  Simtec  Electronics

s3c2410-rtc  s3c2410-rtc:  rtc  disabled,  re-enabling
s3c2410-rtc  s3c2410-rtc:  rtc  core:  registered  s3c  as  rtc0
在終端下用 busybox1.15.2 自帶的 date 命令來查看和設置時間
#date     輸入命令
Thu  Jan    1  00:01:36  UTC  1970     顯示時間
#date  -s  2009.10.22-16:30:10    設置時間格式:年.月.日-時:分:秒
Thu  Oct  22  16:30:10  UTC  2009
#hwclock  -w     保存時間
而後在文件系統的啓動腳本中加入命令:hwclock  -s
每次啓動系統時就會自動同步硬件 RTC 時間:
s3c2410-rtc  s3c2410-rtc:  setting  system  clock  to  2009-10-22  16:32:07  UTC
九>  觸摸屏驅動移植:

內核裏沒有完善的觸摸屏驅動,能夠用咱們提供的觸摸屏驅動
有三個文件:s3c2410_ts.c,  s3c2440_adc.c,  s3c2440adc.h
(在光盤資料/源碼包/驅動源碼/觸摸屏驅動)
將 s3c2410_ts.c 拷貝到 drivers/input/touchscreen 目錄下,修改該目錄下 Kconfig
文件,在第 14 行加入:
config  TOUCHSCREEN_S3C2410
tristate  "Samsung  S3C2410  touchscreen  input  driver"
depends  on  INPUT  &&  S3C2440_ADC
help
Say  Y  here  if  you  have  the  s3c2410  touchscreen.
        If  unsure,  say  N.
        To  compile  this  driver  as  a  module,  choose  M  here:  the
        module  will  be  called  s3c2410_ts.

修改同目錄下 Makefile 文件,在第 9 行加入:
obj-$(CONFIG_TOUCHSCREEN_S3C2410)           +=  s3c2410_ts.o

將  s3c2440_adc.c,  s3c2440_adc.h  拷貝到  drivers/char  目錄下,修改同目錄下
Kconfig 文件,在第 7 行加入:

config  S3C2440_ADC
bool  "ADC  driver  for  S3C2440  development  boards"
help
this  is  ADC  driver  for  S3C2440  development  boards
Notes:  the  touch-screen-driver  required  this  option
修改同目錄下 Makefile 文件,在第 12 行加入:
obj-$(CONFIG_S3C2440_ADC)           +=  s3c2440_adc.o
配置內核,支持觸摸屏:
Device  Drivers  --->
Character  devices  --->
[*]  ADC  driver  for  S3C2440  development  boards
Input  devices  support  --->
<*>  Event  interface
[*]  Touchscreens  --->
<*>  Samsung  S3C2410  touchscreen  input  driver
啓動時輸出:
s3c2410  TouchScreen  successfully  loaded
input:  s3c2410  TouchScreen  as  /class/input/input0

**********************************************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************************************
**********************************************************************************************************************************************************************************************************
十>  USB 設備驅動移植

內核裏已經作好了很完善的 USB 驅動了,能夠支持大多數 USB 設備,TX2440A
板子上使用了 USB  HUB,擴展出四個 USB,內核裏也有對 USB  HUB 的支持,可直接使
用。
配置內核,支持 USB:
Device  drivers  --->
SCSI  Device  support  --->
<*>  SCSI  device  support
[*]  legacy  /proc/scsi/  support
<*>  SCSI  disk  support
[*]  HID  Devices  --->

<*>  USB  Human  Interface  Device  (full  HID)  support
[*]  /dev/hiddev  raw  HID  device  support
[*]  USB  support  --->
<*>  Support  for  Host-side  USB
[*]  USB  device  filesystem
[*]  USB  device  class-devices(DEPRECATED)
<*>  USB  Monitor
<*>  OHCI  HCD  support
<*>  USB  Mass  Storage  support
USB  Human  Interface  Device  (full  HID)  support  是對 USB 鼠標鍵盤的支持
SCSI  disk  support  和 USB  Mass  Storage  support  是對 U 盤的支持
啓動時輸出:
Initializing  USB  Mass  Storage  driver...
usbcore:  registered  new  interface  driver  usb-storage
USB  Mass  Storage  support  registered.
usbcore:  registered  new  interface  driver  libusual
usb  1-1:  configuration  #1  chosen  from  1  choice
hub  1-1:1.0:  USB  hub  found
hub  1-1:1.0:  4  ports  detected
若是出現這個,說明已經找到 USB  HUB,可使用四個 USB 設備。
U 盤的掛載:
插入 U 盤後會提示:
[root@TX2440A /dev]# usb 1-1.4: new full speed USB device using s3c2410-ohci
and  address  3            ?  插入第三個 USB 口
usb  1-1.4:  configuration  #1  chosen  from  1  choice
scsi0  :  SCSI  emulation  for  USB  Mass  Storage  devices
scsi 0:0:0:0: Direct-Access
2
Kingston DataTraveler G2    1.00 PQ: 0 ANSI:
sd  0:0:0:0:  [sda]  7831552  512-byte  logical  blocks:  (4.00  GB/3.73  GiB)
sd  0:0:0:0:  [sda]  Write  Protect  is  off
sd  0:0:0:0:  [sda]  Assuming  drive  cache:  write  through
sd  0:0:0:0:  Attached  scsi  generic  sg0  type  0

27

sd  0:0:0:0:  [sda]  Assuming  drive  cache:  write  through
sda:  sda1       ?  設備名稱
sd  0:0:0:0:  [sda]  Assuming  drive  cache:  write  through
sd  0:0:0:0:  [sda]  Attached  SCSI  removable  disk
U 盤的設備名稱就是 sda1,將它掛載到/mnt/udisk3 目錄下:
#mount  /dev/sda1  /mnt/udisk3
進入/mnt/udisk3 目錄就能夠查看 U 盤中的內容了。
卸載 U 盤,用命令:
#umount  /mnt/udisk3
若是再插入一個 U 盤,會提示:
[root@TX2440A  /]#  usb  1-1.1:  new  full  speed  USB  device  using  s3c2410-ohci
and  address  4
usb  1-1.1:  configuration  #1  chosen  from  1  choice
scsi1  :  SCSI  emulation  for  USB  Mass  Storage  devices
scsi 1:0:0:0: Direct-Access
0  CCS
Lenovo     USB Flash Drive    1100 PQ: 0 ANSI:
sd  1:0:0:0:  [sdb]  15663104  512-byte  logical  blocks:  (8.01  GB/7.46  GiB)
sd  1:0:0:0:  Attached  scsi  generic  sg1  type  0
sd  1:0:0:0:  [sdb]  Write  Protect  is  off
sd  1:0:0:0:  [sdb]  Assuming  drive  cache:  write  through
sd  1:0:0:0:  [sdb]  Assuming  drive  cache:  write  through
sdb:  sdb1     ?  設備名稱
sd  1:0:0:0:  [sdb]  Assuming  drive  cache:  write  through
sd  1:0:0:0:  [sdb]  Attached  SCSI  removable  disk
注意,新插入的這個 U 盤的設備名稱爲 sdb1,依此類推,再插入的 U 盤設備名稱將
會是 sdc1 和 sdd1。
十一>  USB 攝像頭驅動移植

配置內核,支持 USB 攝像頭:
Device  Drivers  --->
<*>  Multimedia  support  --->

<*>  Video  For  Linux
[*]  Enable  Video  For  Linux  API  1  (DEPRECATED)
[*]  Video  capture  adapters  --->
[*]  V4L  USB  devices  --->
<*>  USB  Video  Class  (UVC)
[*]  UVC  input  events  device  support
[*]  GSPCA  based  webcams  --->
到這裏,咱們就能夠選擇所須要的 USB 攝像頭驅動,固然也能夠選擇全部的 USB
攝像頭驅動支持(這樣編譯出的內核會比較大)
GSPCA 是一個萬能攝像頭驅動程序,進入 GSPCA  based  webcams 進行選擇。
插入 USB 攝像頭(我使用的 UVC 攝像頭),會提示:
usb  1-1.2:  new  full  speed  USB  device  using  s3c2410-ohci  and  address  5
usb  1-1.2:  configuration  #1  chosen  from  1  choice
uvcvideo:  Found  UVC  1.00  device  Saturn  USB  2.0  Camera.  (0ac8:3313)
input:  Saturn  USB  2.0  Camera.  as  /class/input/input1
它的設備名稱是:/dev/video0
十二>  CMOS  攝像頭驅動移植

準備好 CMOS 攝像頭驅動源碼,包含 5 個文件:
s3c2440_ov9650.c  s3c2440_camif.c    s3c2440_camif.h    sccb.c  sccb.h
(在光盤資料/源碼包/驅動源碼/camera 驅動)

將這 5 個文件複製到 drivers/media/video 目錄下,修改 drivers/media/目錄
下 Kconfig 文件,在 101 行加入:
config    S3C2440_CAMERA
tristate  "OV9650  on  the  S3C2440  driver"
depends  on  VIDEO_DEV  &&  ARCH_S3C2410
default  y  if  (VIDEO_DEV  &&  ARCH_S3C2410)
修改 drivers/media/video 目錄下 Makefile 文件,在 15 行加入:
s3c2440_camera-objs  :=  s3c2440_ov9650.o  s3c2440_camif.o  sccb.o
在後面 165 行加入:
obj-$(CONFIG_S3C2440_CAMERA)  +=  s3c2440_camera.o

 

配置內核,支持 CMOS  攝像頭:
Device  Drivers  --->
<*>  Multimedia  support  --->
<*>  OV9650  on  the  S3C2440  driver
啓動時輸出:
initializing  s3c2440  camera  interface......
s3c2440  camif  init  done
Loading  OV9650  driver.........
SCCB  address  0x60,  manufacture  ID  0xFFFF,  expect  0x7FA2
十三>  其餘字符設備驅動移植

TX2440A 開發板上還有不少外圍設備:LED,按鍵,ADC,蜂鳴器,溫度傳感器,
紅外收發器,CAN 總線控制器。咱們須要編寫驅動,並加入到內核中。
因爲這些驅動所有加入內核,會使內核體積增大,而且咱們也不常常用到這些
設備,最好的辦法是把這些驅動編譯成模塊,放入文件系統中,而後能夠根據須要
動態的加載或卸載驅動模塊,增長了驅動使用的靈活性。

將驅動程序源碼(在光盤資料/源碼包/驅動源碼)
TX2440_adc.c  TX2440_beep.c  TX2440_button.c  TX2440_ds18b20.c  TX2440_led.c
放到 drivers/char/目錄下,修改同目錄下 Kconfig 文件,在第 13 行加入:
config  TX2440_LED
tristate  "TX2440  LED  Driver"
depends  on  ARCH_S3C2440
help
this  is  LED  Driver  for  TX2440  development  boards
config  TX2440_BEEP
tristate  "TX2440  BEEP  Driver"
depends  on  ARCH_S3C2440
help
this  is  BEEP  Driver  for  TX2440  development  boards
config  TX2440_ADC
tristate  "TX2440  ADC  Driver"
depends  on  ARCH_S3C2440
help
this  is  ADC  Driver  for  TX2440  development  boards
config  TX2440_BUTTON
tristate  "TX2440  BUTTON  Driver"
depends  on  ARCH_S3C2440
help
this  is  BUTTON  Driver  for  TX2440  development  boards
config  TX2440_DS18B20
tristate  "TX2440  DS18B20  Driver"
depends  on  ARCH_S3C2440
help
this  is  DS18B20  Driver  for  TX2440  development  boards
修改同目錄下 Makefile 文件,在 13 行加入:
obj-$(CONFIG_TX2440_LED) +=  TX2440_led.o
obj-$(CONFIG_TX2440_BEEP)     +=  TX2440_beep.o
obj-$(CONFIG_TX2440_ADC) +=  TX2440_adc.o
obj-$(CONFIG_TX2440_BUTTON)  +=  TX2440_button.o
obj-$(CONFIG_TX2440_DS18B20)  +=  TX2440_ds18b20.o
配置內核,支持驅動模塊:
Device  Drivers  --->
Character  devices  --->
[M]  TX2440  LED  Driver
[M]  TX2440  BEEP  Driver
[M]  TX2440  ADC  Driver
[M]  TX2440  BUTTON  Driver
[M]  TX2440  DS18B20  Driver
'M'表示將驅動編譯成模塊


執行:#make  M=drivers/char/  modules       (modules前面有個空格)
注意:視頻和原手冊裏寫的是  #make SUBDIR=drivers/char/ modules,應改爲上面
這個命令
編譯完成後,會在  drivers/char/目錄下生成  TX2440_xxx.ko  的文件,將這幾
個文件複製到根文件系統下  lib/modules/2.6.31/文件夾下。 (在串口終端上 ,在開發板的LINUX文件系統下, 先把文件下載進開發板的文件系統裏,在把他們從開發板的根目錄下複製到lib/modules/2.6.31)
在光盤資料/源碼包/驅動測試程序源碼  目錄下有這幾個驅動的測試程序,在這
幾個目錄中執行 make,編譯出可執行程序,複製到文件系統的  usr/bin 目錄下。
燒入製做好的根文件系統,由於這裏只是編譯了驅動模塊,內核並無更新,
因此不須要從新下載內核。
若是要加載驅動,在開發板上執行:
#insmod  lib/modules/2.6.31/TX2440_xxx.ko
便可動態加載驅動,而後用測試程序,測試驅動的使用狀況
若是要卸載驅動,在開發板上執行:
#rmmod  TX2440_xxx     便可動態卸載驅動
若是要查看當前系統已加載的驅動,可執行:
#lsmod       會列出加載的驅動列表
注意:在 2.6.31 版本的內核中,驅動模塊必須放在 lib/modules/2.6.31 目錄
下,執行 insmod 和 rmmod 時,系統會自動查找該目錄下的驅動模塊。
十四>  LCD 背光驅動移植和開機 LOGO 的製做

將背光驅動源碼(在光盤目錄/源碼包/驅動源碼)TX2440_backlight.c  放到
drivers/video/目錄下,修改同目錄下 Kconfig 文件,在 1948 行加入:
config  TX2440_BACKLIGHT
tristate  "Backlight  support  for  TX2440A"
depends  on  FB_S3C2410
help
LCD  backlight  driver  for  TX2440A

修改同目錄下 Makefile 文件,在最後面加入:
obj-$(CONFIG_TX2440_BACKLIGHT)  +=  TX2440_backlight.o

 


配置內核,支持 LCD 背光:
Device  Drivers  --->
Graphics  support  --->
<*>  Support  for  frame  buffer  devices  --->
<*>  Backlight  support  for  TX2440A
系統啓動時,自動加載背光驅動,設備名爲:TX2440-backlight
測試背光驅動:
執行  #echo  0  >  /dev/TX2440-backlight     會使 LCD 背光熄滅
執行  #echo  1  >  /dev/TX2440-backlight     會使 LCD 背光點亮
製做開機 LOGO:
方法一:
drivers/video/logo/logo_linux_clut224.ppm  是默認的啓動 LOGO 圖片,格式
爲 ppm,把本身的 LOGO 圖片(png 格式)轉換成 ppm 格式,替換這個文件,同時刪
除 logo_linux_clut224.c  logo_linux_clut224.o 文件,從新編譯
ppm 圖片的生成:
#  pngtopnm  logo_linux_clut224.png  >  logo_linux_clut224.pnm
#  pnmquant  224  logo_linux_clut224.pnm  >  logo_linux_clut224.pnm
#  pnmtoplainpnm  logo_linux_clut224.pnm  >  logo_linux_clut224.ppm
而後從新編譯內核,啓動就能夠了!
咱們使用的屏是 320X240 的,要找一個 320X240 大小的 png 格式圖片!
分析:先把 png 格式轉換成 pnm 格式,但內核的 LOGO 最高只支持 224 色,因此
要把顏色轉換成 224 色(第二條命令),這時可能會出錯:pnmcolormap ELF read error
之類的,多是轉成 png 格式時不對,確保 png 的格式文件正常
最後把 pnm 轉成 ppm,文件名必須是這個 logo_linux_clut224.ppm。
方法二:
用 RedHat9 自帶的圖片編輯工具 GIMP。
找一個任意格式的圖片(JPG,BMP 之類的),在圖形界面中,右鍵單擊這個圖片,
選"打開方式->The GIMP",第一次打開須要安裝 GIMP 軟件,安裝完後自動運行 GIMP,
這是一個很強大的圖像處理工具,可稱爲 Linux 下的 photoshop。

右鍵單擊窗口中的圖片選"圖像->模式->索引",把顏色數改成:224(這步很
重要)。其餘的都默認,OK 後右鍵"文件->Save  As",保存爲 ppm 格式的文件,確
定後彈出一個對話框,選擇 Ascii,OK 後,GIMP 會把圖片轉換成 ppm 格式,把這個
文件複製到 logo 文件夾中就能夠了
製做不一樣分辨率的開機 LOGO,以適應所使用的 LCD:
咱們要使開機 LOGO 自動適應於 3.5 寸和 7 寸 LCD,如今已經有了 320X240 的圖
片  ,  再  按  照  上  面  的  方  法  制  做  一  張   800X480   的  圖  片  ,  取  名  爲  :
logo_linux_clut224_q70.ppm
修改 drivers/video/logo 目錄下的 Kconfig 文件,在第 26 行添加:
config  LOGO_LINUX_CLUT224
bool  "Standard  224-color  Linux  logo  W35"
depends  on  LOGO  &&  FB_S3C2410_W35
default  y
config  LOGO_LINUX_Q70_CLUT224
bool  "Standard  224-color  Linux  logo  Q70"
depends  on  LOGO  &&  FB_S3C2410_Q70
default  y
修改同目錄下的 Makefile 文件,在第 6 行添加:
obj-$(CONFIG_LOGO)
+=  logo.o
obj-$(CONFIG_LOGO_LINUX_MONO)
obj-$(CONFIG_LOGO_LINUX_VGA16)
+=  logo_linux_mono.o
+=  logo_linux_vga16.o
obj-$(CONFIG_LOGO_LINUX_CLUT224)     +=  logo_linux_clut224.o
obj-$(CONFIG_LOGO_LINUX_Q70_CLUT224)    +=  logo_linux_q70_clut224.o
obj-$(CONFIG_LOGO_BLACKFIN_CLUT224)      +=  logo_blackfin_clut224.o
obj-$(CONFIG_LOGO_BLACKFIN_VGA16)    +=  logo_blackfin_vga16.o
修改內核源碼目錄下的 include/linux/linux_logo.h 文件,在第 37 行添加:
extern  const  struct  linux_logo  logo_linux_mono;
extern  const  struct  linux_logo  logo_linux_vga16;
extern  const  struct  linux_logo  logo_linux_clut224;
extern  const  struct  linux_logo  logo_linux_q70_clut224;
extern  const  struct  linux_logo  logo_blackfin_vga16;
extern  const  struct  linux_logo  logo_blackfin_clut224;

 

修改 drivers/video/logo/logo.c 文件,在第 64 行添加:
if  (depth  >=  8)  {
#ifdef  CONFIG_LOGO_LINUX_CLUT224
/*  Generic  Linux  logo  */
logo  =  &logo_linux_clut224;
#endif
#ifdef  CONFIG_LOGO_LINUX_Q70_CLUT224
/*  Generic  Linux  logo  */
logo  =  &logo_linux_q70_clut224;
#endif
#ifdef  CONFIG_LOGO_BLACKFIN_CLUT224
/*  Blackfin  Linux  logo  */
logo  =  &logo_blackfin_clut224;
#endif
配置內核:
進入 LCD 配置選項(見第四部分),選擇 LCD 類型,開機 LOGO 會自動適應你所選擇
的 LCD 尺寸。
若是選擇了 3.5 寸屏,在 Bootup logo 裏的配置選項爲"Standard 224-color Linux
logo  W35"。
若是選擇了 7 寸屏,在 Bootup logo 裏的配置選項爲"Standard 224-color Linux logo
Q70"。
十五>  驅動程序在內核源碼中的位置及設備名稱:
1.  LCD
/dev/fb0
Linux-2.6.31_TX2440A/drivers/video/s3c2410fb.c
2.  DM9000            無設備名
Linux-2.6.31_TX2440A/drivers/net/DM9000.c
3.  UDA1341           /dev/dsp
Linux-2.6.31_TX2440A/sound/soc/s3c24xx/
4.  SD
/dev/mmcblk0
35

Linux-2.6.31_TX2440A/drivers/mmc/
5.  RTC
/dev/rtc0
Linux-2.6.31_TX2440A/drivers/rtc/rtc-s3c.c
6.  觸摸屏            /dev/event0
Linux-2.6.31_TX2440A/drivers/input/touchscreen/s3c2410_ts.c
7.  USB 攝像頭       /dev/video0
Linux-2.6.31_TX2440A/drivers/media/video/gspca
8.  CMOS 攝像頭     /dev/camera
Linux-2.6.31_TX2440A/drivers/media/video/s3c2440_camif.c
9.  USB 鼠標    /dev/mouse0
Linux-2.6.31_TX2440A/drivers/usb/musb
10.  U 盤
/dev/sda
Linux-2.6.31_TX2440A/drivers/usb/storage/
11.  NandFlash         /dev/mtdblock2
Linux-2.6.31_TX2440A/drivers/mtd/nand/
12.  yaffs2 文件系統
Linux-2.6.31_TX2440A/fs/yaffs2
13.  LCD 背光           /dev/TX2440-backlight
Linux-2.6.31_TX2440A/drivers/video/TX2440_backlight.c
14.  串口
/dev/s3c2410_serial0
Linux-2.6.31_TX2440A/drivers/serial/s3c2440.c
15.  其餘字符設備    /dev/TX2440-XXX
Linux-2.6.31_TX2440A/drivers/char/TX2440_xxx.c
十六>  內核更新(2010-6-17)

1.  解決系統下 camera 模塊在 LCD 上顯示圖像顛倒的問題

方法:修改 camera 驅動,在 drivers/media/video/s3c2440_ov9650.c 文件中
修改第 25 行,把{0x1e,  0x0c}改爲{0x1e,  0x1c}

2.  去除 LCD 左上角的閃爍光標

系統啓動後在 LCD 的左上角會有光標閃爍,若是以爲光標礙事,能夠把它去掉。
方法:修改  drivers/video/console/fbcon.c  文件
將  367 行
static  void  fb_flashcursor(void  *private)static

1263 行     void  fbcon_cursor(struct  vc_data  *vc,  int  mode)
這兩個函數中的內容註釋掉(保留函數名,清空函數內容)

3.  修改 LCD 背光控制,使 LCD 常亮

系統啓動後會開啓一個定時器,當到達定時時間後就會關閉 LCD 顯示,也就至關
於進入了待機模式,它能夠由一些事件來喚醒。
默認的待機時間是  10  分鐘,你能夠本身設置這個時間,也能夠關閉待機功能,
使 LCD 背光常亮。
方法:修改 drivers/char/vt.c 文件
第 176 行    static  int  blankinterval  =  10*60;  ?10 分鐘
改爲:       static  int  blankinterval  =  0;         ?改成 0,或自定義時間

4.  加入串口 2  驅動
linux 下的通用串口驅動默認只支持 UART0 和 UART1,UART2 被配置成了紅外驅動,
因爲咱們要使用 UART2 接 GPS、藍牙等模塊,咱們就須要將 UART2 配置成通用串口驅

修改 arch/arm/mach-s3c2440/mach-smdk2440.c,修改第 100 行
[2]  =  {
.hwport
.flags
.ucon
.ulcon
.ufcon
=  2,
=  0,
=  0x3c5,
=  0x03,
=  0x51,
<---0x43 改成 0x03
}

修改 drivers/serial/samsung.c,加入頭文件:
#include  <mach/regs-gpio.h>
#include  <linux/gpio.h>

修改 s3c24xx_serial_startup 函數,在第 404 行加入:

static  int  s3c24xx_serial_startup(struct  uart_port  *port)
{
struct  s3c24xx_uart_port  *ourport  =  to_ourport(port);
int  ret;

dbg("s3c24xx_serial_startup:  port=%p  (%08lx,%p)\n",
port->mapbase,  port->membase);

if  (port->line  ==  2)

{
s3c2410_gpio_cfgpin(S3C2410_GPH(6),  S3C2410_GPH6_TXD2);
s3c2410_gpio_cfgpin(S3C2410_GPH(7),  S3C2410_GPH7_RXD2);
s3c2410_gpio_pullup(S3C2410_GPH(6),  1);
s3c2410_gpio_pullup(S3C2410_GPH(7),  1);
}

rx_enabled(port)  =  1;
?????????
}

從新編譯內核便可使 UART2 驅動生效

相關文章
相關標籤/搜索