Linux内核移植:
1、 获取Linux某一版本的源代码。对ARM平台内核源码的改写由ARM公司完成,在其网上下载相应版本的的内核补丁即可。对于我们来说可以直接用友善之臂光盘中的Linux2.6.29内核,这是支持ARM平台的内核版本。
2、 交叉编译环境的建立。这一步我们用arm-linux-gcc4.3.2版本的交叉编译工具。
3、 编译、配置内核。在Linux环境下,运行make menucofig命令出现内核配置界面,在这里可以配置我们的硬件平台和要加载的驱动程序。配置完成后运行make zImage命令编译内核文件,在目录arch/arm/boot下生成zImage内核文件。在BIOS里选择功能菜单[k]Download linux kernel 将Linux内核下载到开发板。
4、制作文件系统。在Linux下运行#mkyaffs2image root_qtopia root_qtopia.img命令,生成root_qtopia.img 映象文件。在BIOS里选择功能菜单[y]Download root_yaff image 将Linux内核下载到开发板。
Linux驱动程序的添加:
(1)将驱动文件(例如adc.c)复制到kernel/drivers/char目录下,该目录下保存了Linux的字符型设备的驱动程序。
(2)在kernel/drivers/char目录下的makefile文件中填加如下代码:
ifeg($(CONFIG_ADC),Y)
L_OBJS+=ADC.o
Endif
编译内核时生成ADC.o文件
(3)在kernel/drivers/char目录下修改config.in文件,在comment’Character devices’下面添加:
bool ‘support for ADC’CONFIG_ADC
这样,在配置内核时就出现support for ADC的选项。
(4)用mknod命令来创建设备文件mknod adc c 120 0,其中adc为设备文件名,c指的是字符设备,120是主设备号,0是次设备号。
使用Linux内核自带的SPI总线驱动(Linux内核版本:2.6.29,micro2440开发板)
首先在配置Linux内核选项开启相应的SPI选项-> Device Drivers
-> SPI support
SPI support
*** SPI Master Controller Drivers ***
-*- Bitbanging SPI master
<*> Samsung S3C24XX series SPI
< > Samsung S3C24XX series SPI by GPIO
*** SPI Protocol Masters ***
< > SPI EEPROMs from most vendors
<*> User mode SPI device driver support
< > Infineon TLE62X0 (for power switching)
选择SPI support 是使Linux 内核提供SPI 支持,选择该选项会默认选择Bitbanging SPImaster,还需选择Samsung S3C24XX series SPI,告诉内核使用S3C2440A的SPI 控制器驱动。
然后在arch/arm/mach-s3c2440/mach-mini2440.c文件添加:
static struct spi_board_info s3c2410_spi0_board[] = {
[0] = {
.modalias = \"spidev\",/*跟spidev.ko驱动名要相同,不然挂载不上*/
.bus_num = 1, //使用第二条BUS线,micro第一条线没有引出
.chip_select = 0,//在/dev下生成spidev1.0的设备文件
.irq = IRQ_EINT9,//使用中断号9
.max_speed_hz = 500*1000,//时钟频率
},
};
static struct s3c2410_spi_info s3c2410_spi0_platdata = {
.pin_cs = S3C2410_GPB1,//cs引脚
.num_cs = 1,
.bus_num = 1,
};
mini2440_devices数组中添加
&s3c_device_spi0
mini2440_machine_init函数中添加
s3c_device_spi0.dev.platform_data= &s3c2410_spi0_platdata;
spi_register_board_info(s3c2410_spi0_board, ARRAY_SIZE(s3c2410_spi0_board));
说明:
spi_register_board_info函数将spi_board_info结构体信息添加到内核board_list链表中,在加载s3c2410-spi模块时依次调用关系是:s3c24xx_spi_probe--> spi_bitbang_start -->spi_register_master-->scan_boardinfo,在scan_boardinfo时遍历整个board_list链表,根据bus_num找到我们添加进去的spi_board_info。然后回到内核根目录,执行#make zImage编译结束后,会在arch/arm/boot 目录下生成linux 内核映象文件:zImage,通过超级终端下载到开发板上。