ioctl小试牛刀(1)的进阶笔记,该底层ioctl处理通过移位的方式可以控制所有的寄存器!~
main.c 上层应用测试代码
#include #include #include #include #include #include #include "../ioctl_c.h" GPIO_Data_S io_ctl; void main(void) { int testdev; int i; char buf[10]; testdev = open ("/dev/test",O_RDWR); if(testdev == -1) { printf("Cann't open file...../n"); exit(0); } printf("buf = 0x%x/n",buf); read(testdev,buf,10); write(testdev,buf,1); while(1) { io_ctl.port=6; io_ctl.bit=5; io_ctl.value=1; io_ctl.v=0; ioctl(testdev,GPIO_IO_SET,&io_ctl); ioctl(testdev,GPIO_IO_WRITE,&io_ctl); ioctl(testdev,GPIO_IO_READ,&io_ctl); io_ctl.port=6; io_ctl.bit=6; io_ctl.value=1; io_ctl.v=1; ioctl(testdev,GPIO_IO_SET,&io_ctl); ioctl(testdev,GPIO_IO_WRITE,&io_ctl); ioctl(testdev,GPIO_IO_READ,&io_ctl); sleep(1); io_ctl.port=6; io_ctl.bit=6; io_ctl.value=1; io_ctl.v=0; ioctl(testdev,GPIO_IO_SET,&io_ctl); ioctl(testdev,GPIO_IO_WRITE,&io_ctl); ioctl(testdev,GPIO_IO_READ,&io_ctl); io_ctl.port=6; io_ctl.bit=5; io_ctl.value=1; io_ctl.v=1; ioctl(testdev,GPIO_IO_SET,&io_ctl); ioctl(testdev,GPIO_IO_WRITE,&io_ctl); ioctl(testdev,GPIO_IO_READ,&io_ctl); sleep(1); } // ioctl(testdev,GPIO_IO_WRITE,sizeof(GPIO_Data_S)); // ioctl(testdev,GPIO_IO_READ,sizeof(GPIO_Data_S)); printf("%s",buf); // for(i = 0;i<10;i++) // printf("[%d]/n",buf[i]); close(testdev); } /* mknod /dev/test c 253 0 */
ioctl底层驱动代码实现
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ioctl_c.h" unsigned int test_major=253; unsigned int test_minor=0; struct cdev cdevc; MODULE_LICENSE("Dual BSD/GPL"); GPIO_Data_S ioctl; static int read_test(struct file *file,char *buf,int count ,loff_t *f_pos) { printk("/n read_test"); printk("%d",count); return count; } static int write_test(struct file *file,const char *buf,int count, loff_t *f_pos) { printk("/n write_test"); return count; } static void gpio_cfg() { size_t Data; printk("gpio_cfg start!/n"); Data = __raw_readl(ioctl.port*0x10+S3C2410_GPACON); Data &= ~(3<<2*ioctl.bit); Data |= (ioctl.value<<2*ioctl.bit); __raw_writel(Data,ioctl.port*0x10+S3C2410_GPACON); } static void gpio_read() { printk("gpio_read start!!/n"); size_t Data_con,Data_dat; Data_con = __raw_readl(ioctl.port*0x10+S3C2410_GPACON); Data_dat = __raw_readl(ioctl.port*0x10+S3C2410_GPADAT); printk("%ld/n%ld/n",Data_con,Data_dat); } static void gpio_write() { printk("gpio-write start!!/n"); size_t Data; Data = __raw_readl(ioctl.port*0x10+S3C2410_GPADAT); Data &= ~(1<