利用两天的时间,终于写成功了第一个LED驱动,对于一个新手来说,我很兴奋.
下面说一下我的心得
一 首先要在你的宿主机上建立起一个和你的目标机一样的内核环境.
1 先拿到目标机上运行的内核的源代碼
2 读取目标机的内核源代碼的.config文件,这是你的内核设置的文件,用他来建立和目标机一样的内核环境.
3 make zImage
二 写Makefile
__________________________________________________________________________
CC=arm-linux-gcc
LD=arm-linux-ld
KER_INC := /root/s3c2410/DISK4/linux2.4/2.4.18-rmk7/include
LIB_INC := /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include/
CFLAGS := -O -s -Wall -D__GNUC__=3 -DMODULE -D__KERNEL__ -march=armv4 -nostdinc -I- -I. -I$(KER_INC) -idirafter $(LIB_INC)
all: led.o
led.o: led_driver.c
@echo
@echo --------------------------------------------------
@echo - Build led
@echo --------------------------------------------------
$(CC) $(CFLAGS) -c led_driver.c
clean:
rm -f *.o
_____________________________________________________________________________
KER_INC:是你的内核的库
LIB_INC:是你的编译器的库
最好使用编译内核的编译器,这样不容易出问题
三 写驱动文件
——————————————————————————————————————
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include<asm-arm/arch/S3C2410.h>
#include<linux/fs.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/devfs_fs_kernel.h>
MODULE_LICENSE("GPL");
int led_open(struct inode *,struct file *);
int led_ctl(struct inode *,struct file *,unsigned int command,unsigned long arg);
struct file_operations led_ctl_fops=
{
open:led_open,
ioctl:led_ctl,
};
int led_open(struct inode * a ,struct file * b)
{
//your core
return 0;
}
int led_ctl(struct inode * a,struct file * n,unsigned int command,unsigned long arg)
{
//your core
return 0;
}
int init_led(void)
{
//your core
return 0;
}
void cleanup_led(void)
{
//your core
}
module_init(init_led);
module_exit(cleanup_led);
——————————————————————————————————————
四 感谢
这次主要感谢我的连接里的两位兄弟给了我很大的支持.
他们的BLOG里有好多有用的东西,朋友们有时间可以去看看.
下面说一下我的心得
一 首先要在你的宿主机上建立起一个和你的目标机一样的内核环境.
1 先拿到目标机上运行的内核的源代碼
2 读取目标机的内核源代碼的.config文件,这是你的内核设置的文件,用他来建立和目标机一样的内核环境.
3 make zImage
二 写Makefile
__________________________________________________________________________
CC=arm-linux-gcc
LD=arm-linux-ld
KER_INC := /root/s3c2410/DISK4/linux2.4/2.4.18-rmk7/include
LIB_INC := /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include/
CFLAGS := -O -s -Wall -D__GNUC__=3 -DMODULE -D__KERNEL__ -march=armv4 -nostdinc -I- -I. -I$(KER_INC) -idirafter $(LIB_INC)
all: led.o
led.o: led_driver.c
@echo
@echo --------------------------------------------------
@echo - Build led
@echo --------------------------------------------------
$(CC) $(CFLAGS) -c led_driver.c
clean:
rm -f *.o
_____________________________________________________________________________
KER_INC:是你的内核的库
LIB_INC:是你的编译器的库
最好使用编译内核的编译器,这样不容易出问题
三 写驱动文件
——————————————————————————————————————
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include<asm-arm/arch/S3C2410.h>
#include<linux/fs.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/devfs_fs_kernel.h>
MODULE_LICENSE("GPL");
int led_open(struct inode *,struct file *);
int led_ctl(struct inode *,struct file *,unsigned int command,unsigned long arg);
struct file_operations led_ctl_fops=
{
open:led_open,
ioctl:led_ctl,
};
int led_open(struct inode * a ,struct file * b)
{
//your core
return 0;
}
int led_ctl(struct inode * a,struct file * n,unsigned int command,unsigned long arg)
{
//your core
return 0;
}
int init_led(void)
{
//your core
return 0;
}
void cleanup_led(void)
{
//your core
}
module_init(init_led);
module_exit(cleanup_led);
——————————————————————————————————————
四 感谢
这次主要感谢我的连接里的两位兄弟给了我很大的支持.
他们的BLOG里有好多有用的东西,朋友们有时间可以去看看.