OK 6410 android開発ボードにledドライバモジュールを追加し、NDKでドライバをテスト

4483 ワード

手順:
      1. linux開発ボードと同様に、ledドライバを追加してテストします.過程は前の文章に書いたようなものだ.http://blog.csdn.net/wangben50/article/details/8657180
     
#include 
#include 
#include 
#include     /*copy_to_user,copy_from_user*/
#include          /*inl(),outl()*/
#include 
#include 
//#define S3C64XX_GPMCON (unsigned long)ioremap(0x7F008820,4)
//#define S3C64XX_GPMDAT (unsigned long)ioremap(0x7F008824,4)
//#define S3C64XX_GPMDAT  (unsigned long)ioremap(0x7F008828,4)

static long S3C64XX_GPMCON=0xF4500820;   /*       ,       S3C6410       。         ,ioremap()      。*/
static long S3C64XX_GPMDAT=0xF4500824;
#define LED_MAJOR 240                    /*    */

int led_open(struct inode *inode,struct file *file)
{
	unsigned tmp;
	tmp=inl(S3C64XX_GPMCON);
	printk("the pre GPMCON is %x",tmp);
	tmp=inl(S3C64XX_GPMDAT);
	printk("the pre GPMDAT is %x",tmp);
	outl(0x00111111,S3C64XX_GPMCON);         /* GPMCON        ,  GPM0-5 output */
	printk("#############open#############");
	return 0;
}

static ssize_t led_read(struct file *file,char __user *buf,size_t count,loff_t * f_pos)
{
	unsigned tmp=inl(S3C64XX_GPMDAT);
       	int num=copy_to_user(buf,&tmp,count);
	if(num==0)
	   printk("copy successfully");
	else printk("sorry  copy failly");

	printk("the GPMDAT is %x.",tmp);
	return count;
}
static ssize_t led_write(struct file * file,const char __user * buf,size_t count,loff_t * f_pos)/*    write()   LED  ,     ioctl()   */
{
	char kbuf[10];
	printk("###########write###########");
	int num=copy_from_user(kbuf,buf,count);
	if(num==0)
	     printk("copy successfully");
        else printk("sorry  copy failly");
	printk("##the kbuf is %c",kbuf[0]);
	switch(kbuf[0])
	{
		case 0://off
			outl(0xff,S3C64XX_GPMDAT);  /*  GPMDAT[0:5]   , LED  ,  LED         */
			break;
		case 1://on
			outl(0x00,S3C64XX_GPMDAT);  /*  GPMDAT[0:5]   , LED  */
			break;
		default:
			break;
	}
	return count;
}

int led_release(struct inode *inode,struct file *file)
{
	printk("#######release##########");
	return 0;
}

struct file_operations led_fops={
	.owner = THIS_MODULE,
	.open = led_open,
	.read = led_read,
	.write = led_write,
	.release = led_release,
};
int __init led_init(void)
{
	int rc;
	printk("Test led dev
"); rc=register_chrdev(LED_MAJOR,"led",&led_fops); if(rc<0) { printk("register %s char dev error
","led"); return -1; } printk("OK!
"); return 0; } void __exit led_exit(void) { unregister_chrdev(LED_MAJOR,"led"); printk("module exit
"); } module_init(led_init); module_exit(led_exit);

コンパイル駆動生成6410 led.koファイル.把koファイルは開発ボードに移動します.
開発ボードで実行
/# insmod 6410led.ko 6410led: module license 'unspecified' taints kernel. Disabling lock debugging due to kernel taint Test led dev OK!/# lsmod 6410led 1839 0 - Live 0xbf000000 (P)/# mknod/dev/led c 240 0/# chmod 777/dev/led
ドライバモジュールの追加が完了しました.
      2. Androidプロジェクトを構築し、SDK、NDK開発と協力してapkソフトウェアテスト駆動を生成する.図面のようなエンジニアリング構造:
                                                                                                  
説明:1 Led.JAvaメインフォルダ.
2 NDKはSDKより1つ多いフォルダjniこのフォルダの下に2つのファイルがあります.一つはandroid専用Makefile、もう一つはJNIプログラムです.どのようにNDKを構築して、JNICプログラムをコンパイルして、ここではもう話しません.
3 NDKでコンパイルしてarmeabiファイルの下にlibled_を生成するjni.soダイナミックライブラリ.もしあなたがlinuxの下でNDKを使うならば、windowsの下でeclipseを使って、直接生成します.soファイルは工事の下にコピーすればいいです.
Windowsの下でcygwinと協力してNDKツールを使用することもできます.
注意:cygwinをインストールした後、インストールディレクトリの下D:cygwinhomeAdministratorのを変更します.bash_プロファイルファイル.ファイルの末尾にndk-buildのインストールパスを追加し、Fディスクのandroid-ndk-r 8 dの下にあります.次のように追加します.
                            ndk=/cygdrive/f/android-ndk-r8d
                            export NDKROOT
次のようなインタフェースを使用します.
                             在OK6410 android开发板上添加led驱动模块,并通过NDK测试驱动_第1张图片
4その後.JAva呼び出しlibled_jni.so,libled_jni.soドライバを呼び出す.apkソフトウェアアプリケーションレイヤ呼び出しドライバを完了します.
詳細なエンジニアリングコードをアップロードします.http://download.csdn.net/detail/wangben50/5155638