创建3个节点。sys下面和proc、dev下面。

创建3个节点。sys下面和proc、dev下面。


sys下节点的产生。


/*访问设置属性方法*/  
static ssize_t led_val_show(struct device* dev, struct device_attribute* attr,  char* buf);  
static ssize_t led_val_store(struct device* dev, struct device_attribute* attr, const char* buf, size_t count);  
  
/*定义设备属性*/  
static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, led_val_show, led_val_store);  


其中sys下节点是个二进制文件,可以直接读写。其会有内核调用 show和store、DEVICE_ATTR是定义给个device_attribute的变量。其变量名字为dev_attr_##val(##为替换)。本例中定义了dev-attr_val变量。

之后调用class_creat device_creat device_creat_file 产生属性文件。属性文件名字为val。

led_class = class_create(THIS_MODULE, DEVICE_NAME); 

temp = device_create(led_class, NULL, dev, "%s",DEVICE_NAME);  //dev为设备号

err = device_create_file(temp, &dev_attr_val);


产生了sys就产生了dev下节点。。。同时在show和store中可以实现读写操作要实现的功能。


proc目录的产生。


/*创建/proc/led文件*/  
static void led_create_proc(void) {  
    struct proc_dir_entry* entry;  
      
    entry = create_proc_entry(DEVICE_NAME, 0, NULL);  
    if(entry) {  
    //    entry->owner = THIS_MODULE;  
        entry->read_proc = led_proc_read;  
        entry->write_proc = led_proc_write;  
    }  
}  



以上函数在模块卸载时对应的remove函数为



  device_destroy(led_class, MKDEV(led_major, led_minor));  
  class_destroy(led_class);  

 remove_proc_entry(DEVICE_NAME, NULL);  


http://download.csdn.net/detail/kuangrenyu/4175427

以上内容个人总结。如有不对。欢迎指正

***********************************************************************************************************

下边把灯点到android上吧

************************************************************************************************************

如果把这一层简单的看作hal层。那么可以简单的写个JNI层


int fd;


/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
 */
void Java_com_ledCtr_LedCtr_setOn( JNIEnv* env,  
      jobject thiz )
{
  add code
}


void Java_com_ledCtr_LedCtr_setOff( JNIEnv* env,
        jobject thiz )
{
  add code
}


void Java_com_ledCtr_LedCtr_ledInit( JNIEnv* env,
        jobject thiz )
{

fd = open("/dev/leds", O_RDONLY);


if (fd < 0)
{
return 1;
}


return 0;
}


JNI命名规则 Java_包名_类名_函数名()

这就意味着在应用程序中首先要创建一个包名和类名 他们名字和JNI定义的一样。这个类有点类似与server类,这个类中声明一下这个函数。然后在我的主程序中就可以实现这个类的实体。并通过这个实体调用下层函数。


public class LedCtr {

static{
       System.load("/system/lib/libled-jni.so");//加载JNI库,可以通过JNI接口调用JNI中提供的方法
  }
    public LedCtr() {
        Log.i("LedService", "Go to get LED Stub...");
        ledInit();
    }


    /*
     * Mokoid LED native methods.
     */
    public void ledOn() { //service层方法的实现
        Log.i("MokoidPlatform", "LED On");
setOn();  //调用JNI层的本地方法
    }


    public void ledOff() {
        Log.i("MokoidPlatform", "LED Off");
setOff();
    }


    private static native void ledInit(); //声明本地方法
    private static native void setOn();
    private static native void setOff();
}


******************************************************************************************************

上面一种方法比较简单。但是不是现在android的框架结构。可以作为对hal层的测试使用

*******************************************************************************************************

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值