您的位置:首页 > 其它

micro2440 LED驱动(装载和卸载模块)

2012-03-07 19:51 232 查看
micro2440所用光盘资料如下:



笔记本系统:fedora 13 (编译内核,配置交叉编译环境,详见手册)

台式机系统:windows XP

1、fedora13中:



2、建立一个C文件,取名为my_leds.c
输入以下代码:
#include <linux/miscdevice.h>
#include <mach/regs-gpio.h>
#include <linux/fs.h>
#include <linux/pci.h>

#define DEVICE_NAME "myleds"

static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
};

static unsigned int led_cfg_table [] = {
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
};

static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}

static struct file_operations dev_fops = {
.owner	=	THIS_MODULE,
.ioctl	=	sbc2440_leds_ioctl,
};

static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};

static int __init dev_init(void)
{
int ret;

int i;

for (i = 0; i < 4; i++) {
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 0);
}

ret = misc_register(&misc);

printk (DEVICE_NAME"\tinitialized\n");

return ret;
}

static void __exit dev_exit(void)
{
misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");
以上代码其实就是mini2440_leds.c里面的代码,只不过我把那些用不到的头文件删去了一些不明白为什么要用那么多的头文件,咋一看起来真的很头疼,反正删除之后编译没报错(必须不报错,我删一个就编译一次,有错误就还原回来



3、在Kconfig文件里加入这句话:



4、在Makefile文件里加入:



5、返回到linux根目录,输入make menuconfig;



6、





7、



8、保存配置并退出

9、输入 make modules指令,将生成的my_leds.ko传送到开发板

10、装载模块



11、输入 ls /dev指令查看设备名



12、fedora13下编写测试程序led.c
输入以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
int on;
int led_no;
int fd;
if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
on < 0 || on > 1 || led_no < 0 || led_no > 3) {
fprintf(stderr, "Usage: leds led_no 0|1\n");
exit(1);
}
fd = open("/dev/myleds", 0);
if (fd < 0) {
perror("open device myleds");
exit(1);
}
ioctl(fd, on, led_no);
close(fd);
return 0;
}


13、编写完毕后,输入arm-linux-gcc led.c -o led 指令,将生成的led文件传送到开发板

14、改变led的权限



15、输入指令测试(先点击友善之臂力提供的测试程序,关闭led-player)



16、测试完毕,卸载模块,出现如图所示错误



17、网上搜索问题



18、按网上解答解决问题

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息