首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM平台下:LED内核模块的编译加载

ARM平台下:LED内核模块的编译加载

开发环境: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)
        
继承事业,薪火相传
返回列表