internalFlash_main.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/init.h>
  4. #include <linux/cdev.h>
  5. #include <linux/fs.h>
  6. #include <linux/errno.h>
  7. #include <asm/current.h>
  8. #include <linux/kernel.h>
  9. #include <linux/sched.h>
  10. #include <linux/device.h>
  11. #include <linux/err.h>
  12. #include <asm/uaccess.h>
  13. //#include <stdint.h>
  14. #include "stm32f4xx.h"
  15. #include "stm32f4xx_hal_flash.h"
  16. #include "driver.h"
  17. #include "stm32_hal_legacy.h"
  18. static int major = MAJOR_IFLASH;
  19. static int minor = 0;
  20. static dev_t devno;
  21. static struct cdev *iflash_cdev = NULL;
  22. static int count = 1;
  23. #define DEVNAME "iflash"
  24. static int iflash_open(struct inode *inode, struct file *filep);
  25. static int iflash_close(struct inode *inode, struct file *filep);
  26. static ssize_t iflash_read(struct file *filep, char __user *buf, size_t size, loff_t *offset);
  27. static ssize_t iflash_write(struct file *filep, const char __user *buf, size_t size, loff_t *offset);
  28. static int iflash_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg);
  29. static struct file_operations iflash_ops =
  30. {
  31. .owner = THIS_MODULE,
  32. .open = iflash_open,
  33. .release = iflash_close,
  34. .ioctl = iflash_ioctl,
  35. .read = iflash_read,
  36. .write = iflash_write,
  37. };
  38. static int iflash_open(struct inode *inode, struct file *filep)
  39. {
  40. return 0;
  41. }
  42. static int iflash_close(struct inode *inode, struct file *filep)
  43. {
  44. return 0;
  45. }
  46. static int iflash_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
  47. {
  48. iflash_t iflash_arg;
  49. uint32_t sector = 0;
  50. uint32_t address = 0;
  51. int i;
  52. int ret = 0;
  53. int try = 3;
  54. if ( copy_from_user(&iflash_arg, (void*)arg, sizeof(iflash_t)) )
  55. return -EFAULT;
  56. switch(cmd)
  57. {
  58. case IFLASH_UNLOCK:
  59. //printk("IFLASH_UNLOCK()\n");
  60. ret = HAL_FLASH_Unlock();
  61. break;
  62. case IFLASH_LOCK:
  63. //printk("IFLASH_LOCK()\n");
  64. ret = HAL_FLASH_Lock();
  65. break;
  66. case IFLASH_ERASESECTOR:
  67. //printk("IFLASH_ERASESECTOR()\n");
  68. switch(iflash_arg.sector)
  69. {
  70. case 0:
  71. sector = FLASH_SECTOR_0;
  72. break;
  73. case 1:
  74. sector = FLASH_SECTOR_1;
  75. break;
  76. case 2:
  77. sector = FLASH_SECTOR_2;
  78. break;
  79. case 3:
  80. sector = FLASH_SECTOR_3;
  81. break;
  82. case 4:
  83. sector = FLASH_SECTOR_4;
  84. break;
  85. case 5:
  86. sector = FLASH_SECTOR_5;
  87. break;
  88. case 6:
  89. sector = FLASH_SECTOR_6;
  90. break;
  91. case 7:
  92. sector = FLASH_SECTOR_7;
  93. break;
  94. case 8:
  95. sector = FLASH_SECTOR_8;
  96. break;
  97. case 9:
  98. sector = FLASH_SECTOR_9;
  99. break;
  100. case 10:
  101. sector = FLASH_SECTOR_10;
  102. break;
  103. case 11:
  104. sector = FLASH_SECTOR_11;
  105. break;
  106. case 12:
  107. sector = FLASH_SECTOR_12;
  108. break;
  109. case 13:
  110. sector = FLASH_SECTOR_13;
  111. break;
  112. case 14:
  113. sector = FLASH_SECTOR_14;
  114. break;
  115. case 15:
  116. sector = FLASH_SECTOR_15;
  117. break;
  118. case 16:
  119. sector = FLASH_SECTOR_16;
  120. break;
  121. case 17:
  122. sector = FLASH_SECTOR_17;
  123. break;
  124. case 18:
  125. sector = FLASH_SECTOR_18;
  126. break;
  127. case 19:
  128. sector = FLASH_SECTOR_19;
  129. break;
  130. case 20:
  131. sector = FLASH_SECTOR_20;
  132. break;
  133. case 21:
  134. sector = FLASH_SECTOR_21;
  135. break;
  136. case 22:
  137. sector = FLASH_SECTOR_22;
  138. break;
  139. case 23:
  140. sector = FLASH_SECTOR_23;
  141. break;
  142. }
  143. FLASH_Erase_Sector(sector, FLASH_VOLTAGE_RANGE_3);
  144. break;
  145. case IFLASH_WRITEWORD:
  146. //printk("IFLASH_WRITEWORD()\n");
  147. address = iflash_arg.address;
  148. for(i=0;i<iflash_arg.len;i+=4)
  149. {
  150. try = 3;
  151. while(try>0)
  152. {
  153. ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address+i, ((uint32_t*)&iflash_arg.data[i]));
  154. if(ret = 0)
  155. try=0;
  156. else if(try > 0)
  157. {
  158. try--;
  159. }
  160. else
  161. {
  162. return ret;
  163. }
  164. }
  165. }
  166. break;
  167. case IFLASH_WRITEHALFWORD:
  168. //printk("IFLASH_HALFWORD()\n");
  169. address = iflash_arg.address;
  170. for(i=0;i<iflash_arg.len;i+=2)
  171. {
  172. try = 3;
  173. while(try>0)
  174. {
  175. ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address+i, *((uint16_t*)&iflash_arg.data[i]));
  176. if(ret = 0)
  177. try=0;
  178. else if(try > 0)
  179. {
  180. try--;
  181. }
  182. else
  183. {
  184. return ret;
  185. }
  186. }
  187. }
  188. break;
  189. case IFLASH_WRITEBYTE:
  190. //printk("IFLASH_WRITEBYTE()\n");
  191. address = iflash_arg.address;
  192. for(i=0;i<iflash_arg.len;i++)
  193. {
  194. try = 3;
  195. while(try>0)
  196. {
  197. ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address+i, (uint32_t)iflash_arg.data[i]);
  198. if(ret = 0)
  199. try=0;
  200. else if(try > 0)
  201. {
  202. try--;
  203. }
  204. else
  205. {
  206. return ret;
  207. }
  208. }
  209. }
  210. break;
  211. case IFLASH_WRITE_BYTES:
  212. ret = HAL_FLASH_Unlock();
  213. if(ret != 0)
  214. {
  215. printk("Unlock flash error.");
  216. return ret;
  217. }
  218. switch(iflash_arg.sector)
  219. {
  220. case 0:
  221. sector = FLASH_SECTOR_0;
  222. break;
  223. case 1:
  224. sector = FLASH_SECTOR_1;
  225. break;
  226. case 2:
  227. sector = FLASH_SECTOR_2;
  228. break;
  229. case 3:
  230. sector = FLASH_SECTOR_3;
  231. break;
  232. case 4:
  233. sector = FLASH_SECTOR_4;
  234. break;
  235. case 5:
  236. sector = FLASH_SECTOR_5;
  237. break;
  238. case 6:
  239. sector = FLASH_SECTOR_6;
  240. break;
  241. case 7:
  242. sector = FLASH_SECTOR_7;
  243. break;
  244. case 8:
  245. sector = FLASH_SECTOR_8;
  246. break;
  247. case 9:
  248. sector = FLASH_SECTOR_9;
  249. break;
  250. case 10:
  251. sector = FLASH_SECTOR_10;
  252. break;
  253. case 11:
  254. sector = FLASH_SECTOR_11;
  255. break;
  256. case 12:
  257. sector = FLASH_SECTOR_12;
  258. break;
  259. case 13:
  260. sector = FLASH_SECTOR_13;
  261. break;
  262. case 14:
  263. sector = FLASH_SECTOR_14;
  264. break;
  265. case 15:
  266. sector = FLASH_SECTOR_15;
  267. break;
  268. case 16:
  269. sector = FLASH_SECTOR_16;
  270. break;
  271. case 17:
  272. sector = FLASH_SECTOR_17;
  273. break;
  274. case 18:
  275. sector = FLASH_SECTOR_18;
  276. break;
  277. case 19:
  278. sector = FLASH_SECTOR_19;
  279. break;
  280. case 20:
  281. sector = FLASH_SECTOR_20;
  282. break;
  283. case 21:
  284. sector = FLASH_SECTOR_21;
  285. break;
  286. case 22:
  287. sector = FLASH_SECTOR_22;
  288. break;
  289. case 23:
  290. sector = FLASH_SECTOR_23;
  291. break;
  292. }
  293. FLASH_Erase_Sector(sector, FLASH_VOLTAGE_RANGE_3);
  294. address = iflash_arg.address;
  295. for(i=0;i<iflash_arg.len;i++)
  296. {
  297. try = 3;
  298. while(try>0)
  299. {
  300. ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address+i, (uint32_t)iflash_arg.data[i]);
  301. if(ret = 0)
  302. try=0;
  303. else if(try > 0)
  304. {
  305. try--;
  306. }
  307. else
  308. {
  309. return ret;
  310. }
  311. }
  312. }
  313. ret = HAL_FLASH_Lock();
  314. if(ret != 0)
  315. {
  316. printk("Lock flash error.");
  317. return ret;
  318. }
  319. default:
  320. printk("---> Invalid action\n");
  321. return -EINVAL;
  322. break;
  323. }
  324. return ret;
  325. }
  326. static ssize_t iflash_read(struct file *filep, char __user *buf, size_t size, loff_t *offset)
  327. {
  328. return 0;
  329. }
  330. static ssize_t iflash_write(struct file *filep, const char __user *buf, size_t size, loff_t *offset)
  331. {
  332. return 0;
  333. }
  334. static int __init iflash_init(void)
  335. {
  336. int ret;
  337. iflash_cdev = cdev_alloc();
  338. if(iflash_cdev == NULL){
  339. return -ENOMEM;
  340. }
  341. cdev_init(iflash_cdev,&iflash_ops);
  342. devno = MKDEV(major,minor);
  343. ret = register_chrdev_region(devno, count, DEVNAME);
  344. if(ret){
  345. goto ERR_STEP;
  346. }
  347. ret = cdev_add(iflash_cdev, devno, count);
  348. if(ret){
  349. goto ERR_STEP1;
  350. }
  351. printk("iflash module start...\n");
  352. return 0;
  353. ERR_STEP1:
  354. unregister_chrdev_region(devno,count);
  355. ERR_STEP:
  356. cdev_del(iflash_cdev);
  357. return ret;
  358. }
  359. static void __exit iflash_exit(void)
  360. {
  361. unregister_chrdev_region(MKDEV(major,minor),count);
  362. cdev_del(iflash_cdev);
  363. }
  364. module_init(iflash_init);
  365. module_exit(iflash_exit);
  366. MODULE_LICENSE("GPL");
  367. MODULE_AUTHOR("Jimbo");
  368. MODULE_DESCRIPTION("this is iflash module");