zoukankan      html  css  js  c++  java
  • ok6410 android driver(3)

      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.01
    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 5
        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 = 0;
        unsigned char buf[4];
    
        testdev = open("/dev/wordcount2", O_RDWR);
    
        if(testdev == -1) {
            printf("Can not open file.
    ");
            return 0;
        }
    
        if(argc > 1) {
            printf("Strings : %s.
    ", argv[1]);
            write(testdev, argv[1], strlen(argv[1]));
        }
    
        read(testdev, buf, 4);
    
        num =     ((int)buf[0]) << 24 | 
            ((int)buf[1]) << 16 | 
            ((int)buf[2]) << 8  | 
            ((int)buf[3]);
    
        printf("Word Byte : 0x%d%d%d%dH
    ", buf[0], buf[1], buf[2], buf[3]);
        printf("word count: %d
    ", num);
    
        close(testdev);
        return 0;
    }

      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 5
        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.

      

  • 相关阅读:
    每周总结(第九周)
    每周总结(第七周)
    每周总结(第六周)
    成功案例和第五周总结
    结对编程和第四周总结
    每周总结(第三周)
    node.js爬取图片
    机器学习15 手写数字识别-小数据集
    机器学习13 14 深度学习-卷积
    机器学习12 垃圾邮件分类2(13)
  • 原文地址:https://www.cnblogs.com/plinx/p/3209500.html
Copyright © 2011-2022 走看看