lcd.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "stm32f10x.h"
  2. #include "rtthread.h"
  3. #include "fmt0371/FMT0371.h"
  4. static rt_err_t lcd_init (rt_device_t dev)
  5. {
  6. ftm0371_port_init();
  7. ftm0371_init();
  8. return RT_EOK;
  9. }
  10. static rt_err_t lcd_open(rt_device_t dev, rt_uint16_t oflag)
  11. {
  12. return RT_EOK;
  13. }
  14. static rt_err_t lcd_close(rt_device_t dev)
  15. {
  16. return RT_EOK;
  17. }
  18. static rt_err_t lcd_control(rt_device_t dev, rt_uint8_t cmd, void *args)
  19. {
  20. /* rate control */
  21. return RT_EOK;
  22. }
  23. static rt_size_t lcd_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  24. {
  25. unsigned int i;
  26. unsigned short *p;
  27. unsigned int x,y;
  28. size = size / 2;
  29. y = (pos/2) / 240;
  30. x = (pos/2)%240;
  31. LCD_ADDR = 0x02; // X start point
  32. LCD_DATA = x;
  33. LCD_ADDR = 0x03; // Y start point
  34. LCD_DATA16( y );
  35. LCD_ADDR = 0x0E; // start write
  36. p = (unsigned short *) buffer;
  37. if (size > (240-x))
  38. {
  39. for (i=0;i<(240-x);i++)
  40. {
  41. LCD_DATA16(*p++);
  42. }
  43. LCD_ADDR = 0x02; // X start point
  44. LCD_DATA = 0;
  45. LCD_ADDR = 0x03; // Y start point
  46. LCD_DATA16( y+1 );
  47. size -= (x+1);
  48. while (size--)
  49. {
  50. LCD_DATA16(*p++);
  51. }
  52. }
  53. else
  54. {
  55. for (i=0;i<size;i++)
  56. {
  57. LCD_DATA16(*p++);
  58. }
  59. }
  60. return RT_EOK;
  61. }
  62. struct rt_device lcd_device;
  63. rt_err_t lcd_hw_init(void)
  64. {
  65. GPIO_InitTypeDef GPIO_InitStructure;
  66. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
  67. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  68. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  69. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  70. GPIO_Init(GPIOF,&GPIO_InitStructure);
  71. GPIO_SetBits(GPIOF,GPIO_Pin_9);
  72. ftm0371_port_init();
  73. ftm0371_init();
  74. lcd_device.type = RT_Device_Class_Block;
  75. lcd_device.rx_indicate = RT_NULL;
  76. lcd_device.tx_complete = RT_NULL;
  77. lcd_device.init = lcd_init;
  78. lcd_device.open = lcd_open;
  79. lcd_device.close = lcd_close;
  80. lcd_device.read = RT_NULL;
  81. lcd_device.write = lcd_write;
  82. lcd_device.control = lcd_control;
  83. lcd_device.private = RT_NULL;
  84. return rt_device_register(&lcd_device, "lcd",RT_DEVICE_FLAG_RDWR);
  85. }