默認分類 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 驅動生效