pcDuino day3
来源:互联网 发布:买二手物品的软件 编辑:程序博客网 时间:2024/05/21 02:20
Hello_module.c
#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <asm/uaccess.h>#include <linux/slab.h>MODULE_AUTHOR("song");MODULE_LICENSE("GPL");MODULE_DESCRIPTION("A simple test for kernel module.");MODULE_ALIAS("a simple module");int hello_open(struct inode *, struct file *);int hello_release(struct inode *, struct file *);ssize_t hello_read(struct file *, char __user *buff, size_t bufsiz, loff_t *);ssize_t hello_write(struct file *, const char __user *buff, size_t bufsiz, loff_t *);struct file_operations hello_fops = { .open = hello_open, .release = hello_release, .read = hello_read, .write = hello_write,};#define DEVICE_NAME "Hello_Driver" //proc/devices#define BUFF_SIZE 128int major;unsigned char *pbuff;int rd_pos;int wr_pos;static int __init hello_init(void){ printk(DEVICE_NAME" Hello world in kernel module\n"); major = register_chrdev(0, DEVICE_NAME, &hello_fops); //12位主设备号 20位次设备号 if(major < 0){ printk(DEVICE_NAME" register %s fial\n", DEVICE_NAME); return major; } printk(DEVICE_NAME" got major number: %d\n", major); return 0;}static void __exit hello_exit(void){ printk(DEVICE_NAME" Hello world exit\n"); unregister_chrdev(major, DEVICE_NAME); //释放资源}module_init(hello_init); //模块加载module_exit(hello_exit); //模块卸载int hello_open(struct inode *pinode, struct file *pfile){ printk(DEVICE_NAME" hello_open\n"); wr_pos = 0; rd_pos = 0; pbuff = (unsigned char *)kmalloc(BUFF_SIZE, 0); if(pbuff == NULL) { printk(DEVICE_NAME" kmalloc fail\n"); return 1; } return 0;}int hello_release(struct inode *pinode, struct file *pfile){ printk(DEVICE_NAME" hello_release\n"); kfree(pbuff); return 0;}// __user *buff 用户空间内存地址ssize_t hello_read(struct file *pfile, char __user *buff, size_t bufsiz, loff_t *poffset){ int i = 0; for(i = 0; i < bufsiz && (wr_pos - rd_pos) > 0; i++) { put_user(pbuff[rd_pos%BUFF_SIZE], buff + i); //复制一个字节从内核空间到用户空间 rd_pos++; }#if 0 int len = wr_pos - rd_pos; if(len > 0){ int err = copy_to_user((char *)buff, pbuff + rd_pos%BUFF_SIZE, len > bufsiz ? bufsiz : len); rd_pos += len > bufsiz ? bufsiz : len; if(!err) return len > bufsiz ? bufsiz : len; }#endif return i;}ssize_t hello_write(struct file *pfile, const char __user *buff, size_t bufsiz, loff_t *poffset){ int i = 0; for(i = 0; i < bufsiz && (BUFF_SIZE - (wr_pos - rd_pos)) > 0; i++) { get_user(pbuff[wr_pos%BUFF_SIZE], buff + i); //复制一个字节从内核空间到用户空间 wr_pos++; } return i;#if 0 int free_len = BUFF_SIZE - (wr_pos - rd_pos); if(free_len > bufsiz) { int err = copy_from_user((char *)pbuff+wr_pos%BUFF_SIZE, buff, bufsiz); wr_pos += bufsiz; if(!err) return bufsiz; } return -1;#endif}
Makefile
obj-m := hello_module.oKDIR := /home/mrhjlong/workspace/pcDuino/a20-kernel/build/sun7i_defconfig-linuxall: make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul*
模块处理
板子系统:
装载:insmod hello_module.ko
卸载:rmmod hello_module
查看:lsmod
查看module信息:modinfo
查看打印信息:
tail /var/log/syslog
cat /proc/modules | grep hello
cat /proc/devices | grep Hello
查看头文件(fs.h 结构体定义):
/home/mrhjlong/workspace/pcDuino/a20-kernel/linux-sunxi/include/linux/fs.h
创建结点(/proc/device/):mknod hello-drv c 241 0
ls -l hello-drv
test_hello_drv.c
#include <stdio.h>#include <stdlib.h>#include <fcntl.h>int main(void){ unsigned char buff[10] = {0}; int fd = open("/dev/hello-drv", O_RDWR); if(fd < 0) { perror("open"); return 1; } while(1) { int wr = write(fd, "hello world", strlen("hello world")); printf("write return %d \n", wr); int rd = read(fd, buff, 64); if(rd < 0) perror("read"); printf("read return %d, %s\n", rd, buff); memset(buff, 0, 64); sleep(1); } close(fd); return 0;// unsigned int buff[10];// int fd = open("/dev/hello-drv", O_RDWR);// if(fd < 0)// {// perror("open");// return 1;// }// int rd = read(fd, buff, 10);// printf("Read return %d \n", rd);// int wd = write(fd, buff, 10);// if(wd < 0)// perror("write");// printf("write return %d\n", wd);// close(fd);// return 0;}
0 0
- pcDuino day3
- day3
- DAY3
- DAY3
- day3
- day3
- day3
- day3
- Day3
- day3
- day3
- Day3
- DAY3
- Day3
- DAY3
- day3
- Day3
- day3
- POI导出excel到jar包冲突查错
- Android中的ANR异常如何分析又该怎么去避免ANR
- HTML5的Web SQL DataBase本地数据库增删改查
- -XX:-UseGCOverheadLimit 参数 java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
- 发布自己的项目到NPM
- pcDuino day3
- iOS_Pass : 限制UITextField中输入内容,如只限制输入数字,字母或者某几个键盘元素。
- iOS 小知识
- Caffe技巧之使用snapshot来继续网络训练
- Git常用命令
- 在博客的开题贴
- tomcat指定项目路径
- java动态代理--自学以及代码
- iOS开发- 音频截取