2440的驱动的研究
一 。 编译器 : 不同版本的编译器不一样,使用的时候得注意 ,不一定高版本的支持的功能就越多或者兼容的越多
arm-linux-gcc-4.3.2.tar.bz2 用于编译u-boot2012.04.01和linux3.4.2
arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2用于编译u-boot1.16和linux2.6.22.6
二 、以下是模块的MAKEFILE文件
KERN_DIR = /work/system/linux-2.6.22.6
all:
make -C $(KERN_DIR) M=`pwd` modules
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += buttons.o
其中 KERN_DIR = /work/system/linux-2.6.22.6 是内核的路径
注意 :1、这个内核是开发板的内核、
2、这个内核的路径在虚拟机的 /work/system/ ,是将开发板的内核源文件解压,配置编译后的文件,其中的uimage 可以下载进开发板
三、驱动的程序的理解:
1、init ,exit 这两个是加载程序和卸载程序,是在系统应用程序(调用该驱动的程序)运行之前进行操作的,因为驱动的使用套路基本是文件操作,在读写文件之前没有文件怎么可以。
2、应用程序调用的时候驱动程序使用 open close 等等操作驱动,所以驱动程序中有与之对应的程序
3、在操作系统上编程,必须使用重映射,这也就是stm32不能运行linux的一个最大原因之一
4、应用程序不能直接进入内核,所以不能直接操作驱动,只能通过copy_to_user 和 copy_from_user 这两个函数,只能出现在驱动中,因为驱动是主动方, 个人猜测 : 驱动可以接收应用程序传来的数据,也可以发送。但是当遇到错误的时候,驱动可以不搭理应用程序,保护自己。
要有韧性