#副標=Linux驅動程式系列(1) #大標=Linux驅動程式整體架構 #眉標=Embedded Systems #作者=文/陳俊宏 ===========box 程式1============ int main(int argc, char *argv[]) { int devfd; devfd = open("/dev/debug", O_RDONLY); if (devfd == -1) { printf("Can't open /dev/debug\n"); return -1; } ioctl(devfd, IOCTL_WRITE, num); close(devfd); return 0; } ===============end============== =========box 程式2=========== #define DEV_MAJOR 121 #define DEV_NAME "debug" #define MSG(format, arg...) printk(KERN_INFO "DEBUG CARD: " format "\n", ## arg) int init_module(void) { MSG("DEBUG CARD v0.1.1"); MSG(" Copyright (C) 2004 www.jollen.org"); if (register_chrdev(DEV_MAJOR, DEV_NAME, &card_fops) < 0) { MSG("Couldn't register a device."); return -1; } return 0; } ================end============= ===========box 程式3============== void cleanup_module(void) { if (unregister_chrdev(DEV_MAJOR, DEV_NAME)) MSG("failed to unregister driver"); else MSG("driver un-installed\n"); } ===============end=========== ========box 程式4========= int card_open(struct inode *inode, struct file *filp) { MOD_INC_USE_COUNT; return 0; }; ============end=========== =============box 程式5=========== int card_release(struct inode *inode, struct file *filp) { MOD_DEC_USE_COUNT; kfree(filp->private_data); //reentrant code 觀念 return 0; }; ================end=============== =========box 程式6========= unsigned long IOPort = 0x80; void write_card(unsigned int num) { MSG("write 0x%02X (%d) to debug card", (unsigned char)num, num); outb((unsigned char)num, IOPort); } ssize_t card_write(struct file *filp, const char *buff, size_t count, loff_t *offp) { char *str; unsigned int num; int i; if (count == 0) return 0; filp->private_data = (char *)kmalloc(64, GFP_KERNEL); str = filp->private_data; if (copy_from_user(str, buff, count)) return -EFAULT; /* atoi() */ num = str[0]-'0'; for (i = 1; i < count; i++) { num = num*10 + (str[i]-'0'); } write_card(num); return 1; }; =============end==============