ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

µÚÒ»¸öLinuxÇý¶¯-s3c6410 gpio
2014-11-24 08:20:37 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:0´Î
Tags£ºÒ»¸ö Linux Çý¶¯ -s3c6410 gpio

ǰ¶Îʱ¼äѧ×ÅдÁ˵ÚÒ»¸ölinuxϵÄÇý¶¯£¬ºÜ¼òµ¥£¬»ùÓÚÓÑÉÆÖ®±ÛµÄtiny6410£¬Í¨¹ý¿ØÖÆGPIOK4-7ÊäÈëÊä³öÀ´¿ØÖưåÉϵÄ4¸öled¡£ledµÄÇý¶¯ÓÑÉÆÒѾ­Ìṩ£¬²»¹ýÎÒ×Ô¼ºÐ´µÄÓÐЩ²»Ò»Ñù£¬Êǰ´ÕÕ±ê×¼µÄcharÇý¶¯À´Ð´µÄ£¬ÏÂÃæÊÇÈ«¹ý³Ì¡£


×¢Ò⣺´Ë´úÂë»ùÓÚÓÑÉÆÖ®±ÛÌṩµÄÒѾ­ÒÆÖ²ºÃµÄlinux2.6.36ºËÐÄ


µÚÒ»²½±àдÇý¶¯´úÂë


//tiny6410_gpio.c


#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#include
#include
#include


#include
#include
#include


#define DEVICE_NAME "tiny6410_gpio" //Çý¶¯Ãû×Ö
#define DEVICE_MAJOR 100 //Ö÷É豸ºÅ
static int tiny6410_gpio_major=DEVICE_MAJOR;


//×Ô¼º¶¨ÒåµÄÃèÊögpioµÄ½á¹¹Ìå
struct tiny6410_gpio_dev
{
struct cdev cdev;//ÃèÊö×Ö·ûÐÍÉ豸µÄcdev½á¹¹Ìå
unsigned *conf0;
unsigned *conf1;
unsigned *data;
unsigned *pud;
};


//³õʼ»¯devÄڵļĴæÆ÷µØÖ·


struct tiny6410_gpio_dev dev=
{
.conf0=S3C64XX_GPKCON,
.conf1=S3C64XX_GPKCON1,
.data=S3C64XX_GPKDAT,
.pud=S3C64XX_GPKPUD,
};


//Õâ¸öÇý¶¯½öʵÏÖreadºÍwriteº¯Êý£¬Ò»¸ö×Ö½Ú´ú±íÒ»¸öµÆµÄ״̬


ssize_t tiny6410_gpio_read (struct file *filp, char __user *buf_user, size_t size, loff_t *f_pos)
{
unsigned val,i;
val=size;
i=*f_pos;
printk("start read start:%x size:%d\r\n",i,val);//Êä³öµ÷ÊÔÐÅÏ¢¡£ºÜÆæ¹Ö£¬Ö±½ÓÊä³ö*f_posºÍsizeÊýÖµ»Ø²»¶Ô£¬Ö»ÄÜÖÐתһÏÂ
if(*f_pos>=4 || size==0)
{
put_user(0,buf_user);
return 0;
}
val=readl(dev.data);
printk("raw val:%x\r\n",val);
val=(val>>(4+*f_pos))&0xf;
for(i=0;i<((size+*f_pos)>4 4-*f_pos:size);i++)
put_user((val>>i)&0x01,buf_user+i);
printk("get val:%x max index:%d\r\n",val,i);
return 0;
}



//ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t tiny6410_gpio_write (struct file *filp, const char __user *buf_user, size_t size, loff_t *f_pos)
{
unsigned char writesize,i,data[4];
unsigned raw;
printk("start write start:%x,size:%d",*f_pos,size);
if(*f_pos>=4)
{
return size;
}
writesize=4-copy_from_user(data,buf_user,size);
if(writesize==0)
{
printk("write size 0!\r\n");
return size;
}
raw=readl(dev.data);
printk("source val:%x,write size:%d\r\n",raw,writesize);
for(i=0;i<((writesize+*f_pos)>4 4-*f_pos:writesize);i++)
{
raw&=~(1<<(i+*f_pos+4));
raw|=((data[i] 1:0)<<(i+4+*f_pos));
}
writel(raw,dev.data);
printk("write end! dest val:%x max index:\r\n",raw,i);
return 4-writesize;
}



//Õâ¸ö½á¹¹ÌåÄڵĺ¯ÊýÊÇÇý¶¯±àдÖ÷ÒªÐ޸ĵĵط½
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
//.unlocked_ioctl = sbc2440_leds_ioctl,
.read = tiny6410_gpio_read,
.write = tiny6410_gpio_write,
};


static int tiny6410_gpio_setup_cdev()
{
int devno=MKDEV(tiny6410_gpio_major,0);
cdev_init(&dev.cdev,&dev_fops);
dev.cdev.owner=THIS_MODULE;
return cdev_add(&dev.cdev,devno,1);//Ìí¼ÓÒ»¸öcdev½á¹¹Ìå
}


¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºLinuxÉ豸Çý¶¯¸ÅÒª ÏÂһƪ£ºAndroid ndk-x86 ±àÒësoÎļþʱÌá..

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Spring Boot Java£º (2025-12-26 16:20:19)
¡¤Spring Boot¤ÇHello (2025-12-26 16:20:15)
¡¤Spring ¤Î»ù±¾¤«¤éŒ (2025-12-26 16:20:12)
¡¤C++Ä£°å (template) (2025-12-26 15:49:49)
¡¤C ÓïÑÔÖÐÄ£°åµÄ¼¸ÖÖ (2025-12-26 15:49:47)