- UID
- 1029342
- 性别
- 男
|
开发环境:VMware虚拟机下的Fedora9linux内核:linux-2.6.32.2(FriendlyARM修正过的,光盘中所附的)
试验平台:mini2440(64M)
实验现象:加载模块时,开发板上的4个LED灯全亮,卸载模块时4个LED灯全熄灭.
1.解压mini2440光盘中的linux-2.6.32.2-mini2440-2010-921.tar.gz到/opt/FriendlyARM/mini2440/.
2.由于此内核源代码顶层目录中的Makefile中的ARCH=arm,CROSS_COMPILE=arm-linux-已被修改,所以在此不用重复此步骤.
3.创建.config文件,这里复制config_mini2440_n35(我的开发板的屏)并重命名为.config
4.编写led.c文件.程序代码如下
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/gpio.h> //对比mini2440用户手册,发现手册中缺少这个头文件
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lucien Song");
static int __init led_init(void)
{
printk("<0>""the four leds turn on!\n");
s3c2410_gpio_cfgpin(S3C2410_GPB(5),S3C2410_GPIO_OUTPUT); //手册中S3C2410_GPB5这种写法是不对的
s3c2410_gpio_cfgpin(S3C2410_GPB(6),S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPB(7),S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPB(8),S3C2410_GPIO_OUTPUT);
s3c2410_gpio_setpin(S3C2410_GPB(5),0);
s3c2410_gpio_setpin(S3C2410_GPB(6),0);
s3c2410_gpio_setpin(S3C2410_GPB(7),0);
s3c2410_gpio_setpin(S3C2410_GPB(8),0);
return (0);
}
static void __exit led_exit(void)
{
printk("<0>""the four leds turn off!\n");
s3c2410_gpio_setpin(S3C2410_GPB(5),1);
s3c2410_gpio_setpin(S3C2410_GPB(6),1);
s3c2410_gpio_setpin(S3C2410_GPB(7),1);
s3c2410_gpio_setpin(S3C2410_GPB(8),1);
}
module_init(led_init);
module_exit(led_exit);
/************************************************************************
//linux-2.6.32.2/arch/arm/mach-s3c2410/include/mach/regs-gpio.h
#define S3C2410_GPIO_OUTPUT (0xFFFFFFF1)
5.将编写好的hello.c文件放到内核源代码的/drivers/char/目录下,然后修改/drivers/char/Makefile文件,如下图.
6.编译内核模块.make modules
编译结束后,将会在源代码目录下的/drivers/char/下生成我们所需要的led.ko文件,将其通过串口下载到mini2440的开发板上.(具体有关串口下载请查看mini2440的用户手册,这里千万不要用ftp传送,经试验用ftp传递的文件大小会发生变化).
7.串口终端下操作开发板,将led.ko文件转移到/lib/modules/2.6.32.2-FriendlyARM/目录下.
8.加载模块.insmod led.ko ,这时将会看到LED都亮了!
9.查看挂载的模块. lsmod
10.查看模块信息.modinfo led(由于开发析上的buybox里没有加入modinfo命令,所以这里不可用),LED全灭!
11.卸载模块.rmmod led(注意这里不是led.ko)
|
|