This article discusses the Makefile and how to port the module to different platform (localhost and arm).

  

  1、localhost

  My localhost system is debian wheezy.

  If you would like to set up the environment for user-mode, you can follow the website :

http://www.cnblogs.com/plinx/p/3149216.html

  Acturely, we could also just use the $(shell uname -r) kernel version in our system.

  The different between these two is which command we need to enter for 'make'.

//user-mode
$ make
//$(shell uname -r)
$ sudo make

  Here is the Makefile :

obj-m := word_count1.o
obj-m += word_count2.o KDIR := /lib/modules/$(shell uname -r)/build
#KDIR := /home/linx/Android/forlinx/android2.3_kernel_v1.
PWD := $(shell pwd)
#ARCH := arm
#CROSS := arm-linux- modules:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS) -C $(KDIR) M=$(PWD) modules allclean:
rm -f *.o *.ko *.mod.c *.mod.o
clean:
rm -f *.o *.mod.c *.mod.o .PHONY : allclean
.PHONY : clean

  If you would like to use the kernel you compile for device driver, just correct the $(shell uname -r) to your directory.

  In the word_count2.c(in previous article), we create a miscdevice(a character divice).

  Device driver provides a mechanism rather than policy.

  To the word_count2.c, we know we could do 'write and read' on the miscdevice 'wordcount2'.

  Two ways to test the device driver :

  (1) shell communicate

  I write the command in a test2.sh file :

#!/bin/sh

devpath="/dev/wordcount2"

echo ">> Insmoding word_count2.ko"
sudo insmod word_count1.ko
if [ -c "$devpath" ]; then
echo ">> Writting to wordcount..."
echo ">> The world count program." > $devpath
echo ""
echo ">> Reading the wordcount..."
sudo cat /dev/wordcount2 echo "------------------------"
sudo rmmod word_count2
echo ">> Rmmoding word_count2.ko" echo ""
echo "----/var/log/syslog-----"
sudo dmesg | grep word | tail -n
echo "------------------------"
echo "" else
echo ">> The word count modules doesn't exits."
fi

  (2) user program communicate

  The following is the ftest.c :

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h> int main(int argc, char *argv[])
{
int testdev;
int ret;
int num = ;
unsigned char buf[]; testdev = open("/dev/wordcount2", O_RDWR); if(testdev == -) {
printf("Can not open file.\n");
return ;
} if(argc > ) {
printf("Strings : %s.\n", argv[]);
write(testdev, argv[], strlen(argv[]));
} read(testdev, buf, ); num = ((int)buf[]) << | \
((int)buf[]) << | \
((int)buf[]) << | \
((int)buf[]); printf("Word Byte : 0x%d%d%d%dH\n", buf[], buf[], buf[], buf[]);
printf("word count: %d\n", num); close(testdev);
return ;
}

  I also write the command in a test3.sh file too :

#!/bin/sh

devpath="/dev/wordcount2"
echo ">> Insmod the wordcount2..."
sudo insmod word_count2.ko
if [ -c "$devpath" ]; then
echo ""
echo ">> ./ftest \"test string 1 2 3\""
echo ""
./ftest wordcount2 "test string 1 2 3"
sudo rmmod word_count2
echo ">> Rmmoding word_count2.ko" echo ""
echo "----- /var/log/syslog ------"
sudo dmesg | grep word | tail -n
echo "----------------------------"
else
echo ">> $devpath doesn't exits"
fi

  2、ok6410-android

  If we want to compile the device drive into an ARM platform, we have to get this :

  (1) cross compiler

  arm-linux- (the compiler support on the cd of forlinx)

  or arm-eabi- (the compiler support on the google android source code)

  (2) source code compiled on arm platform

  Here I got two piece of kernel-source code :

  Android-2.3_kernel (support by forlinx)

  goldfish-2.6.29_kernel (support by google)

  Then we just need to correct the Makefile path.

  After tested, we know :

  (1) the module works properly with two cross compiler and Android-2.3_kernel.

  (2) the module doesn't work on the goldfish-2.6.29_kernel.

  TIPS :

When rmmod, there may wanning :
rmmod : chdir(/lib/modules): No such file or directory

  [Fix]

  Copy the file to /lib/modules/$(uname -r)/

  If there is not this directory, create it.

  3、goldfish emulator

  The same with ok6410 except two different :

  (1) No need to create the directory /lib/modules/$(uname -r)/

  we can insmod and rmmod in any directory

  (2) When we configure the kernel, we should use the goldfish_armv7_defconfig and enable 'Enable loadable module support' and his subproject.

  

ok6410 android driver(3)的更多相关文章

  1. ok6410 android driver(5)

    Test the android driver by JNI (Java Native Interface), In the third article, we know how to compile ...

  2. ok6410 android driver(11)

    This essay, I go to a deeply studying to android HAL device driver program. According to the android ...

  3. ok6410 android driver(9)

    In this essay, I will write the JNI to test our leds device. If you don't know how to create a jni p ...

  4. ok6410 android driver(8)

    In the past, we know how to create and run a simple character device driver on pc, goldfish and ok64 ...

  5. ok6410 android driver(12)

    In this essay, I will talk about how to write the service libraries. TIPS : I won't discuss the name ...

  6. ok6410 android driver(10)

    From this essay, we go to a new discussion "Android Hardware Abstraction Layer". In this e ...

  7. ok6410 android driver(7)

    This article talk about how to test device driver on JNI. There are two ways to test the device driv ...

  8. ok6410 android driver(6)

    This is a short essay about the mistakes in compiling ok6410 android-2.3 source codes. If there is n ...

  9. ok6410 android driver(1)

    target system : Android (OK6410) host system : Debian Wheezy AMD64 1.Set up android system in ok6410 ...

随机推荐

  1. jQuery File Upload跨域上传

    最近在做一个一手粮互联网项目,方案为前后端分离,自己负责前端框架,采用了Requirejs+avalonjs+jquery三个框架完成. 前后端通过跨域实现接口调用,中间也发现了不少问题,尤其是在富文 ...

  2. SQLServer2008新建链接服务器for Oracle

    SQLServer2008新建链接服务器for Oracle   最近要在SQLServer2008中使用Oracle 10g的一个视图,通过建立链接服务器即可在SQLServer中使用Oracle提 ...

  3. 没有公网IP的服务器如何通过有公网的服务器实现远程管理的功能?即VPN服务器搭建过程

    由于很多PPPoE帐号都没有公网IP了,那我们如何实现远程管理呢? 答案是比较简单的,首先,你要拥有一台有公网IP的路由器,其他品牌的也可以,但是下面我以WayOs作为VPN服务器,给大家一个教程. ...

  4. How to get the Current Controller Name, Action, or ID in ASP.NET MVC

    public static class HtmlRequestHelper { public static string Id(this HtmlHelper htmlHelper) { var ro ...

  5. Linux设备驱动剖析之Input(四)

    static void input_pass_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) ...

  6. C primer plus 练习题 第一章

    1. #include <stdio.h> int main() { //将英寸转换为厘米 1英寸=2.54厘米 int inch; printf("请输入英寸:"); ...

  7. windows 程序设计自学:添加图标资源

    #include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...

  8. DNS反射攻击阻止

    刚搭的dns server就有贱人跑dns反射放大攻击,据说bind高版本没洞,但是日志刷刷的跑,感觉也不放心,而且毕竟dns是返回了请求的,所以找了点资料备忘 先设定不受限制的网段 iptables ...

  9. 关于fork的一道经典面试题

    这是一道面试题,问程序最终输出几个“-”: #include<stdio.h> #include<sys/types.h> #include<unistd.h> i ...

  10. location.hash属性介绍

    location.hash属性介绍 例如URL: http://wwww.a.com/index#rhythmk 通过location.hash 我们将获取到 #rhythmk. 默认浏览器会滚动至i ...