Linux驱动开发实验报告.docx
- 文档编号:24392601
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:35
- 大小:530.06KB
Linux驱动开发实验报告.docx
《Linux驱动开发实验报告.docx》由会员分享,可在线阅读,更多相关《Linux驱动开发实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
Linux驱动开发实验报告
Linux驱动开发实验报告
实验一、Linux内核移植实验
1.1资源
1.linux-2.6.24.1.tar.bz2(Linux内核源码的压缩包,下载地址www.kernel.org)
2.yaffs2.tar.gz(yaffs文件系统源码的压缩包)
3.dm9000.h和dm9000.c(dm9000网卡驱动程序)
1.2解压源码包
1.在XP中,把“01/下午/src”文件夹拷贝到“//192.168.1.12”的共享文件夹uptech内,并把uptech中的“src”更名为“01linux”
2.在Linux虚拟机中进入该文件夹“cd/home/uptech/01linux”
ls可见1个文件:
“linux-2.6.24.1.tar.bz2”、“yaffs2.tar.gz”、“dm9000.h”、“dm9000.c”
◆bz2压缩包用“tarjxvf”解压
◆gz压缩包用“tarzxvf”解压
3.解压Linux源码压缩包,即输入命令“tarjxvflinux-2.6.21.1.tar.bz2”
4.解压YAFFS源码压缩包,即输入命令“tarzxvfyaffs2.tar.gz”
1.3修改Makefile文件,支持交叉编译
1.cd/home/uptech/01linux/linux-2.6.21.2,该目录下就是linux的内核源码
2.修改Makefile文件,使之支持交叉编译,也就是在Linux上编译出ARM开发板上运行的内核程序。
ARCH?
=arm(目标平台是arm)
CROSS_COMPILE?
=arm-linux-(交叉编译器的前缀是arm-linux-)
1.1得到.config文件
1.得到.config文件
将“/home/uptech/01linux/linux-2.6.21.2/arch/arm/configs/s3c2110_defconfig”文件拷贝成“/home/uptech/01linux/linux-2.6.21.2/.config”
cparch/arm/configs/s3c2110_defconfig.config
2.对内核进行裁剪(此时暂时不做裁剪,仅是看看)
makemenuconfig
1.5修改NandFlash分区
修改“/home/uptech/01linux/linux-2.6.21.2/arch/arm/plat-s3c21xx/common-smdk.c”文件中的“structmtd-partitionsmdk_default_nand_part[]”这个结构体:
第一个分区从0x00000000到0x00080000,大小为0.5M
第二个分区从0x00080000到0x00280000,大小为2M
第三个分区从0x00280000到0x00680000,大小为1M
第四个分区从0x00680000到0x01000000,大小为57.5M
具体做法:
(1)viarch/arm/plat-s3c21xx/common-smdk.c
(2)修改分区信息结构体
staticstructmtd_partitionsmdk_default_nand_part[]={
[0]={
.name="Bootloader",
.size=0x80000,
.offset=0,
},
[1]={
.name="LinuxKernel",
.offset=0x80000,
.size=SZ_2M,
},
[2]={
.name="RootFileSystem",
.offset=0x280000,
.size=SZ_1M,
},
[3]={
.name="UserSpace",
.offset=0x680000,
.size=0x3980000,
},
};
1.6添加LCD支持
修改“/home/uptech/01linux/linux-2.6.21.2/arch/arm/mach-s3c2110/mach-smdk2110.c”。
具体做法:
(1)viarch/arm/mach-s3c2110/mach-smdk2110.c
(2)在mach-smdk2110.c文件内添加两个头文件
#include
#include
(3)在mach-smdk2110.c文件内添加两个结构体
staticstructs3c2110fb_displayup2110_fb[]__initdata=
{
{
.lcdcon5=(1<<12)|(1<<11)|(1<<9)|(1<<8)|(1<<0),
.type=(3<<5),
.width=610,
.height=180,
.pixclock=39721,
.xres=610,
.yres=180,
.bpp=16,
.left_margin=10,
.right_margin=32,
.hsync_len=32,
.vsync_len=2,
.upper_margin=35,
.lower_margin=5,
},
};
staticstructs3c2110fb_mach_infoup2110_fb_info__initdata=
{
.displays=up2110_fb,
.num_displays=1,
.default_display=0,
.gpcup=0xffffffff,
.gpcup_mask=0x0,
.gpccon=0xaaaaaaaa,
.gpccon_mask=0x0,
.gpdup=0xffffffff,
.gpdup_mask=0x0,
.gpdcon=0xaaaaaaaa,
.gpdcon_mask=0x0,
.lpcsel=0,
};
(1)在mach-smdk2110.c文件内,在“smdk2110_init”函数的末尾一行添加:
s3c21xx_fb_set_platdata(&up2110_fb_info);
1.7添加网卡驱动
1、修改“/home/uptech/01linux/linux-2.6.21.2/arch/arm/mach-s3c2110/mach-smdk2110.c”。
具体做法:
(1)viarch/arm/mach-s3c2110/mach-smdk2110.c
(2)在mach-smdk2110.c文件添加两个结构体,用于定义端口地址和中断号等设备信息
staticstructresources3c_dm9ks_resource[]={
[0]={
.start=0x10000000,
.end=0x10000010,
.flags=IORESOURCE_MEM,
},
[1]={
.start=IRQ_EINT2,
.end=IRQ_EINT2,
.flags=IORESOURCE_IRQ,
},
};
structplatform_devices3c_device_dm9ks={
.name="s3c2110-dm9ks",
.id=-1,
.num_resources=ARRAY_SIZE(s3c_dm9ks_resource),
.resource=s3c_dm9ks_resource,
};
(3)在“structplatform_device*smdk2110_devices[]__initdata”末尾加入网卡数据:
&s3c_device_dm9ks,
2、将新的“dm9000.c”和“dm9000.h”拷贝到“/home/uptech/01linux/linux-2.6.21.2/drivers/net”文件夹内,替换旧的文件。
cp/home/uptech/01linux/dm9000.*drivers/net/
在dm9000.c文件中增加了uptech_dm9k_init函数,并在dm9k_init_module(void)函数中调用了uptech_dm9k_init。
1.8添加YAFFS文件系统支持
1、进入yaffs解压后的文件夹
cd/home/uptech/01linux/yaffs2
2、给Linux打补丁
./patch-ker.shc../linux-2.6.21.1/
3、进入linux内核文件夹
cd/home/uptech/01linux/linux-2.6.21.2
1.9内核配置(即内核裁剪)
1、运行“makemenuconfig”,进入内核配置界面
2、选择硬件系统
SystemType→S3C2110Machines→[*]SMDK2110/A9M2110
其他不要选,以免内核太大
3、配置NandFlash驱动
DeviceDrivers→<*>MemoryTechnologyDevice(MTD)support→<*>NANDDeviceSupport→<*>NANDFlashsupportforS3C2110/S3C2110SoC
1、配置LCD驱动
DeviceDrivers→Graphicssupport→<*>Supportforframebufferdevices→<*>S3C2110LCDframebuffersupport
DeviceDrivers→Graphicssupport→[*]Bootuplogo→[*]StandardblackandwhiteLinuxlogo
[*]Standard16-colorLinuxlogo
[*]Standard221-colorLinuxlogo
5、配置网卡驱动
DeviceDrivers→[*]Networkdevicesupport→[*]Ethernet(10or100Mbit)→
-*-GenericMediaIndependentInterfacedevicesupport
<>ASIXAX88796NE2021clonesupport
[]ASIXAX88796external93CX6eepromsupport
<>SMC91C9x/91C1xxxsupport
<*>DM9000support
<>Broadcom110x/17xxethernetsupport
6、配置文件系统
支持CRAMFS文件系统、YAFFS文件系统、NFS文件系统
Filesystems→Miscellaneousfilesystems→<*>YAFFS2filesystemsupport
-*-512byte/pagedevices
[]Useolder-styleon-NANDdataformatwithpageStatusbyte
[]LetsYaffsdoitsownECC
-*-2021byte(orlarger)/pagedevices
[*]Autoselectyaffs2format
[]Disablelazyloading
[]Turnoffwidetnodes
[]Forcechunkerasecheck
[*]CacheshortnamesinRAM
<>JournallingFlashFileSystemv2(JFFS2)support
<*>CompressedROMfilesystemsupport(cramfs)
Filesystems→[*]NetworkFileSystems→<*>NFSfilesystemsupport
[*]ProvideNFSv3clientsupport
[*]ProvideclientsupportfortheNFSv3ACLprotocolextension
[]ProvideNFSv1clientsupport(EXPERIMENTAL)
[*]AllowdirectI/OonNFSfiles
<>NFSserversupport
[*]RootfilesystemonNFS
1.10编译内核
1.在“/home/uptech/01linux/linux-2.6.21.2”文件夹内运行:
makeclean
make
之后会在“/home/uptech/01linux/linux-2.6.21.2/arch/arm/boot/”内生成内核镜像文件zImage
2.通过zImage生成uImage
(1)新建文件夹“/home/uptech/image”
mkdir/home/uptech/image
cd/home/uptech/image
(2)把“/home/uptech/03u-boot/u-boot-1.3.2/tools/mkimage”拷贝到“/home/uptech/image/”
cp/home/uptech/03u-boot/u-boot-1.3.2/tools/mkimage.
(3)把“/home/uptech/01linux/linux-2.6.21.2/arch/arm/boot/zImage”拷贝到“/home/uptech/image/”
cp/home/uptech/01linux/linux-2.6.21.2/arch/arm/boot/zImage.
(1)生成uImage
./mkimage–Aarm–Tkernel–Cnone–Olinux–a0x30008000–e0x30008010–dzImage–n‘Linux-2.6.21’uImage
1.11烧写内核
1.确认serverip是Linux虚拟机的IP地址
(1)执行“printenv”,查看serverip是否与Linux虚拟机的IP地址一致
(2)若不一致,执行“setenvserverip192.168.1.12”来指定tftp服务器的IP地址
(3)执行“saveenv”保存设置。
2.将生成的uImage文件拷贝到tftpboot目录下:
cpuImage/tftpboot
3.在ARM开发板上运行命令:
tftp0x30008000uImage(把uImage文件下载到ARM开发板的SDRAM中0x30008000开始的空间中)
nanderase0x800000x202100(擦除NandFlash中起始地址为0x80000,大小为0x202100的空间)
nandwrite0x300080000x800000x202100(把SDRAM中0x30008000开始的内容写入NandFlash0x80000开始的空间内,大小为0x202100)
4.重启ARM开发板,执行命令“bootm”,此时液晶屏左上角出现小企鹅图案。
实验二、ARMNorflash驱动实验
2.1、环境
目标板:
mini2440(S3C2440)
交叉编译器:
arm-linux-gcc-4.3.2
操作系统:
Linux(Ubuntu-11.10)
2.2、目的
移植mini2440板子上为2M的NorFlash(型号为SST39VF1601)驱动
2.3、实验步骤
(一).添加配置项
1、修改drivers/mtd/maps/Kconfig文件,在config_EDB7312配置项下添加如下内容:
configMTD_MINI2440
tristate"CFIFlashdevicemappedonMINI2440"
dependsonARM&&MTD_CFI
help
ThisenablesaccesstotheCFIFlashontheCogentMINI2440board.
Ifyouhavesuchaboard,say'Y'here.
2、修改drivers/mtd/maps/Makefile文件,在obj-$(CONFIG_MTD_EDB7312)+=edb7312.o下添加如下内容:
obj-$(CONFIG_MTD_MINI2440)+=mini2440.o
3、复制驱动文件mini2440.c到drivers/mtd/maps目录下
(二).配置编译内核
#makemenuconfig
以下内容必选:
MemoryTechnologyDevices(MTD)-->
<*>MemoryTechnologyDevice(MTD)support
[*]MTDpartitioningsupport
<*>DirectchardeviceaccesstoMTDdevices
<*>CachingblockdeviceaccesstoMTDdevices
RAM/ROM/Flashchipdrivers-->
<*>DetectflashchipsbyCommonFlashInterface(CFI)probe
<*>SupportforInter/Sharpflashchips
<*>SupportforAMD/Fujitsu/Spansionflashchips
<*>CFIflashdevicemappedonmini2440
下列内容(在flash上架fat16/fat32/ntfs/ext2等文件系统时才需要选上)不要选,否则会出现加载驱动模块时会出现ftl_cs:
FTLheadernotfound.
DeviceDrivers->
MemoryTechnologyDevices(MTD)->
<>FTL(FlashTranslationLayer)support
<>NFTL(NANDFlashTranslationLayer)support
<>INFTL(InverseNANDFlashTranslationLayer)support
(三).根据edb7312单板的norflash驱动(linux/mtd/maps/edb7312.c)来写mini2440的norflash驱动
代码在mini2440.c中(带详细注释)
/*支持单板:
mini2440
*支持内核:
3.1.2版本
*模仿驱动:
/linux/drivers/mtd/maps/edb7312.c
*/
#include
#include
#include
#include
#include
#include
#include
#include
#defineWINDOW_ADDR0x00000000/*NORFLASH物理地址*/
#defineWINDOW_SIZE0x00202100/*NORFLASH大小*/
#defineBUSWIDTH2/*估计是2Byte*/
/*探测的接口类型,可以是"cfi_probe","jedec_probe","map_rom",NULL};*/
#definePROBETYPES{"cfi_probe",NULL}
#defineMSG_PREFIX"MINI2440-NOR:
"/*printk的前缀*/
#defineMTDID"mini2440-nor"/*MTD驱动*/
staticstructmtd_info*mymtd;
/*定义一个map_info,代表一块norflash*/
structmap_infomini2440nor_map=
{
.name="NORflashonMINI2440",
.size=WINDOW_SIZE,
.bankwidth=BUSWIDTH,
.phys=WINDOW_ADDR,
};
/*默认分区信息*/
staticstructmtd_partitionstatic_partitions[3]=
{
{
.name="bootloader",
.size=0x40000,//256K
.offset=0
},
{
.name="Kernel",
.size=0x100000,//1M
.offset=0x40000
},
{
.name="RootFS",
.size=0xC0000,//768K
.offset=0x140000
},
};
staticconstchar*probes[]={NULL};
staticintmtd_parts_nb=0;
staticstructmtd_partition*mtd_parts=0;
/*Norflash模型初始化函数
*<1>物理地址映射为虚拟地址:
mini2440nor_map.virt=ioremap(WINDOW_ADDR,WINDOW_SIZE);
*<2>探测norflash芯片,得到map_info:
do_map_probe();//应该是mtd_info,而不是map_info,转载者注释
*<3>探测分区信息,得到mtd_partition:
parse_mtd_partitions();
*<4>利用map_info和mtd_partition注册设备:
mtd_device_register();//应该是mtd_info,而不是map_info,转载者注释
*/
int__initinit_mini2440nor(void)
{
staticconstchar*rom_probe_types[]=PROBETYPES;
constchar**type;
constchar*part_type=0;
printk(KERN_NOTICEMSG_PREFIX"0x%08xat0x%08x\n",WINDOW_SIZE,WI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 驱动 开发 实验 报告