platform总线globalfifo驱动

发布时间:2024-07-24  

功能是使用内存的4k单元,实现读,写,偏移,清除。


  1 /*********************************************************************************

  2  *      Copyright:  (C) 2014 zhouguangfeng

  3  + plat_globalfifo.c                                                                                                      

  4 /*********************************************************************************

  5  *      Copyright:  (C) 2014 zhouguangfeng

  6  *                  All rights reserved.

  7  *

  8  *       Filename:  plat_globalfifo.c

  9  *    Description:  This file is a commom platform driver 

 10  *                                                

 11  *        Version:  1.0.0(08/19/2014)             

 12  *         Author:  zhouguangfeng

 13  *      ChangeLog:  1, Release initial version on "08/19/2014 02:31:17 PM"

 14  *                                       

 15  ********************************************************************************/

 16 #include //struct file_operations  

 17 #include //special type definition,like dev_t off_t defined by typedef  

 18 #include // init and exit 

 19 #include //support module load and unload  

 20 #include                  

 21 #include //memory mannage ,include kmalloc.kfree and so on 

 22 #include           

 23 #include //char device structure definition  

 24 #include      //io operation function ,like ioremap,iowrite  

 25 #include            

 26 #include    //for ioctl command

 27 #include           

 28 #include //platform support

 29 #include          

 30 #include //class_create() and device_create()

 31 

 32 

 33 #define GLOBALFIFO_SIZE       0x1000  /* 4K */

 34 #define NAME                  "globalfifo"

 35 #define KELNEL_OLD             0   /* decsion ioctl() */

 36 

 37 #ifndef GLOBALFIFO_MAJOR

 38 #define GLOBALFIFO_MAJOR       0

 39 #endif

 40 

 41 

 42 //#define GLOBALFIFO_CLEAR      0x17

 43 //#define MEM_CLEAR           __IO (GLOBALFIFO_CLEAR, 0x20)

 44 #define MEM_CLEAR              0x20

 45 

 46 

 47 static int globalfifo_major = GLOBALFIFO_MAJOR;

 48 static int globalfifo_minor = 0;

 49 

 50 

 51 /*  ============================ Platform Device part =============================== */

 52 

 53 struct globalfifo_dev

 54 {

 55     struct cdev cdev;

 56     unsigned int current_len;

 57     unsigned char mem[GLOBALFIFO_SIZE];

 58     struct class   *class;

 59 

 60 

 61     //struct semaphrore sem;

 62    // wait_queue_t r_wait;

 63     //wait_queue_t r_wait;

 64 } globalfifo_dev;

 65 

 66 static void plat_release(struct device * dev)

 67 {

 68     return;

 69 }

 70 

 71 static struct platform_device globalfifo_device = {

 72         .name = "globalfifo",

 73         .id   = 1,

 74         .dev  = {

 75             .release = plat_release,

 76         },

 77 };

 78 

 79 

 80 

 81 /*  ===================== globalfifo driver part ===========================*/

 82 

 83 int globalfifo_open(struct inode *inode, struct file *filp)

 84 {

 85     struct globalfifo_dev *dev;

 86 

 87     dev = container_of(inode->i_cdev, struct globalfifo_dev, cdev);

 88     filp->private_data = dev;

 89 

 90     return 0;

 91 }

 92 

 93 int globalfifo_release(struct inode *inode, struct file *filp)

 94 {

 95     return 0;

 96 }

 97 

 98 

 99 #if KELNEL_OLD

100 static ssize_t globalfifo_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

101 {

102     struct globalfifo_dev *dev = filp->private_data;

103     switch(cmd)

104     {

105          case  MEM_CLEAR:

106             memset(dev->mem, 0, GLOBALFIFO_SIZE);

107             printk(KERN_INFO "globalfifo is set to zeron");

108             break;

109 

110          default:

111             return -EINVAL;

112     }

113 

114     return 0;

115 }

116 #endif

117 

118 static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t size, loff_t *opps)

119 {

120     unsigned long p = *opps;

121     unsigned int count = size;

122     int ret = 0;

123 

124     struct globalfifo_dev *dev = filp->private_data;

125 

126     if(p >= GLOBALFIFO_SIZE)

127     {

128          return count ? -ENXIO : 0;

129     }

130     if(count > GLOBALFIFO_SIZE - p)

131     {

132          count = GLOBALFIFO_SIZE - p;

133     }

134 

135     if(copy_to_user(buf, (void *)((dev->mem)+p), count))

136     {

137          ret = -EFAULT;

138     }

139     else

140     {

141         *opps += count;

142          ret = count;

143          printk(KERN_INFO"read %u bytes(s) from %lun", count, p);

144     }

145 

146     return ret;

147 }

148 

149 static ssize_t globalfifo_write(struct file *filp, const char __user *buf, size_t size, loff_t *opps)

150 {

151     unsigned long  p = *opps;

152     unsigned int count = size;

153     int ret;

154 

155     struct globalfifo_dev *dev = filp->private_data;

156 

157     if(p >= GLOBALFIFO_SIZE)

158     {

159         return count ? -ENXIO : 0;

160     }

161 

162     if(count > GLOBALFIFO_SIZE - p)

163     {

164         count = GLOBALFIFO_SIZE - p;

165     }

166 

167     if(copy_from_user(((dev->mem)+p), buf, count))

168     {

169         ret = -EFAULT;

170     }

171     else

172     {

173        *opps =+ count;

174         ret = count;

175         printk(KERN_INFO "written %u bytes(s) from %lun", count, p);

176     }

177     return ret;

178 }

179 

180 

181 #if 1

182 static loff_t globalfifo_llseek(struct file *filp, loff_t offset, int orig)

183 {  

184     loff_t ret = 0;

185     

186     switch(orig)

187     {

188         case 0:

189             if(offset <0 )

190             {

191                 ret = -EINVAL;

192                 break;

193             }

194 

195             if((unsigned int )offset > GLOBALFIFO_SIZE)

196             {

197                 ret = -EINVAL;

198                 break;

199             }

200             filp->f_pos = (unsigned int)offset;

201             ret = filp->f_pos;

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>