- 论坛徽章:
- 0
|
本帖最后由 蚊仔perlperl 于 2014-02-18 22:40 编辑
各位前辈,本人不懂C,我想要编译下面一段代码,提示错误: amiwrap.c:39: warning: initialization from incompatible pointer type (在这里38行)
请教是哪里出了问题,帮忙修正。我用的kernel是 3.7.5
38行是修改过的,原来的是 :ioctl: wrap_ioctl, 出现的错误是amiwrap.c:39: error: unknown field ‘ioctl’ specified in initializer
在网上找了一遍这个错误,是kernel的这个对象什么结构变了(不怎么懂),所以修改成unlocked_ioctl: wrap_ioctl ,但还是出错这个错误.
还有就是这个可以在2.6.x的kernel编译通过
amiwarp.c- #include <linux/version.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/fs.h>
- #include <linux/string.h>
- #include <linux/errno.h>
- #include <linux/mm.h>
- #include <linux/vmalloc.h>
- #include <linux/mman.h>
- #include <linux/slab.h>
- #include <asm/io.h>
- #include <asm/uaccess.h>
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
- #include <linux/wrapper.h>
- #endif
- #include "amiwrap.h"
- extern int amifldrv_ioctl(void);
- extern int amifldrv_mmap(void);
- unsigned long ulArg0;
- unsigned long ulArg1;
- unsigned long ulArg2;
- pgprot_t pgArg0;
- void *pvArg0;
- void *pvArg1;
- AFU_ATTRIBUTE_FUNC static int wrap_open(struct inode *inode, struct file *file);
- AFU_ATTRIBUTE_FUNC static int wrap_release(struct inode *inode, struct file *file);
- AFU_ATTRIBUTE_FUNC static int wrap_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
- AFU_ATTRIBUTE_FUNC static int wrap_mmap(struct file *file, struct vm_area_struct *vma);
- struct file_operations amifldrv_fops =
- {
- owner: THIS_MODULE,
- open: wrap_open,
- release: wrap_release,
- unlocked_ioctl: wrap_ioctl,
- mmap: wrap_mmap,
- };
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- #define mem_map_reserve(p) set_bit(PG_reserved, &((p)->flags))
- #define mem_map_unreserve(p) clear_bit(PG_reserved, &((p)->flags))
- MODULE_AUTHOR("American Megatrends Inc.");
- MODULE_DESCRIPTION("AMI Flash Update utility driver");
- MODULE_LICENSE("Dual BSD/GPL");
- #endif
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
- static int device_open_count = 0;
- #endif
- AFU_ATTRIBUTE_FUNC
- int wrap_open(struct inode *inode, struct file *file)
- {
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
- MOD_INC_USE_COUNT;
- #else
- if (device_open_count)
- return -EBUSY;
- device_open_count++;
- try_module_get(THIS_MODULE);
- #endif
- return(0);
- }
- AFU_ATTRIBUTE_FUNC
- int wrap_release(struct inode *inode, struct file *file)
- {
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
- MOD_DEC_USE_COUNT;
- #else
- device_open_count--;
- module_put(THIS_MODULE);
- #endif
- return(0);
- }
- AFU_ATTRIBUTE_FUNC
- int wrap_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
- {
- pvArg0 = inode;
- pvArg1 = filp;
- ulArg0 = cmd;
- ulArg1 = arg;
- return amifldrv_ioctl();
- }
- AFU_ATTRIBUTE_FUNC
- int wrap_mmap(struct file *file, struct vm_area_struct *vma)
- {
- pvArg0 = file;
- pvArg1 = vma;
- return amifldrv_mmap();
- }
- AFU_ATTRIBUTE_FUNC
- int wrap_register_chrdev()
- {
- return register_chrdev((unsigned int)ulArg0, "amifldrv", (struct file_operations *)pvArg0);
- }
- AFU_ATTRIBUTE_FUNC
- void wrap_mem_map_reserve()
- {
- mem_map_reserve((struct page*)pvArg0);
- }
- AFU_ATTRIBUTE_FUNC
- void wrap_mem_map_unreserve()
- {
- mem_map_unreserve((struct page*)pvArg0);
- }
- AFU_ATTRIBUTE_FUNC
- struct page *wrap_virt_to_page()
- {
- return virt_to_page(ulArg0);
- }
- AFU_ATTRIBUTE_FUNC
- int wrap_remap_page_range()
- {
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
- ulArg1 = ulArg1>>PAGE_SHIFT;
- return remap_pfn_range((struct vm_area_struct *)pvArg0, ulArg0, ulArg1, ulArg2, pgArg0);
- #else
- return remap_page_range((struct vm_area_struct *)pvArg0, ulArg0, ulArg1, ulArg2, pgArg0);
- #endif
- }
- AFU_ATTRIBUTE_FUNC
- void *wrap_kmalloc()
- {
- return kmalloc((size_t)ulArg0, (int)ulArg1);
- }
- AFU_ATTRIBUTE_FUNC
- void wrap_kfree()
- {
- kfree(pvArg0);
- }
- AFU_ATTRIBUTE_FUNC
- int wrap_printk(const char *fmt, ...)
- {
- va_list args;
- char buffer[1024];
- va_start(args, fmt);
- (void) vsnprintf(buffer, sizeof(buffer), fmt, args);
- va_end(args);
- return printk("%s", buffer);
- }
- AFU_ATTRIBUTE_FUNC
- unsigned long wrap_copy_from_user()
- {
- return copy_from_user(pvArg0, pvArg1, ulArg0);
- }
- AFU_ATTRIBUTE_FUNC
- unsigned long wrap_copy_to_user()
- {
- return copy_to_user(pvArg0, pvArg1, ulArg0);
- }
复制代码 这里是一个 amiwarp.h 文件.- #define AFU_ATTRIBUTE_FUNC
- AFU_ATTRIBUTE_FUNC int wrap_register_chrdev(void);
- AFU_ATTRIBUTE_FUNC void wrap_unregister_chrdev(void);
- AFU_ATTRIBUTE_FUNC void wrap_mem_map_reserve(void);
- AFU_ATTRIBUTE_FUNC void wrap_mem_map_unreserve(void);
- AFU_ATTRIBUTE_FUNC int wrap_remap_page_range(void);
- AFU_ATTRIBUTE_FUNC struct page *wrap_virt_to_page(void);
- AFU_ATTRIBUTE_FUNC void *wrap_kmalloc(void);
- AFU_ATTRIBUTE_FUNC void wrap_kfree(void);
- AFU_ATTRIBUTE_FUNC int wrap_printk(const char *fmt, ...);
- AFU_ATTRIBUTE_FUNC unsigned long wrap_copy_from_user(void);
- AFU_ATTRIBUTE_FUNC unsigned long wrap_copy_to_user(void);
- extern unsigned long ulArg0;
- extern unsigned long ulArg1;
- extern unsigned long ulArg2;
- extern pgprot_t pgArg0;
- extern void *pvArg0;
- extern void *pvArg1;
复制代码 Makefile- ifndef KERNEL
- KERNEL = /lib/modules/$(shell uname -r)/build
- endif
- EXTRA_CFLAGS := -Wall -Wstrict-prototypes -O2 -fno-strict-aliasing
- obj-m += amifldrv_mod.o
- amifldrv_mod-objs := amifldrv.o amiwrap.o
- default:
- make -C $(KERNEL) SUBDIRS=$(PWD) modules
- rm -f amifldrv_mod.o
- mv amifldrv_mod.ko amifldrv_mod.o
- .PHONY : clean
- clean:
- rm -f *.*~
- rm -f .*cmd
- rm -f *.o
- rm -f *mod*
- rm -f *.ko
- rm -f -d -r .tmp_versions/
复制代码 |
|