This commit is contained in:
unknown 2022-01-01 22:28:28 +08:00
parent 8a5f76b39d
commit 6dbd3aaad0
10 changed files with 3811 additions and 0 deletions

View File

@ -0,0 +1,25 @@
CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_ENV_SIZE=0x8000
CONFIG_ENV_OFFSET=0xf8000
CONFIG_MACH_SUNIV=y
CONFIG_DRAM_CLK=156
CONFIG_DRAM_ZQ=0
# CONFIG_VIDEO_SUNXI is not set
CONFIG_DEFAULT_DEVICE_TREE="suniv-f1c100s-licheepi-nano"
CONFIG_SPL=y
# CONFIG_CMD_FLASH is not set
# CONFIG_CMD_FPGA is not set
CONFIG_CMD_SF=y
CONFIG_CMD_SPI=y
CONFIG_ENV_IS_IN_SPI_FLASH=y
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_BAR=y
CONFIG_SPI_FLASH_GIGADEVICE=y
CONFIG_SPI_FLASH_MACRONIX=y
CONFIG_SPI_FLASH_WINBOND=y
CONFIG_SPL_SPI_SUNXI=y
# CONFIG_SPL_DM_SERIAL is not set
CONFIG_DM_SPI=y
CONFIG_SUN6I_SPI=y

View File

@ -0,0 +1,160 @@
CONFIG_LOCALVERSION="-licheepi-zero"
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_CGROUPS=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_PERF_EVENTS=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_ARCH_SUNXI=y
# CONFIG_MACH_SUN4I is not set
# CONFIG_MACH_SUN5I is not set
# CONFIG_MACH_SUN6I is not set
# CONFIG_MACH_SUN7I is not set
# CONFIG_MACH_SUN9I is not set
CONFIG_SMP=y
CONFIG_HAVE_ARM_ARCH_TIMER=y
CONFIG_NR_CPUS=8
CONFIG_ARM_PSCI=y
CONFIG_AEABI=y
CONFIG_HIGHMEM=y
CONFIG_ARM_APPENDED_DTB=y
CONFIG_ARM_ATAG_DTB_COMPAT=y
CONFIG_CPU_FREQ=y
CONFIG_CPUFREQ_DT=y
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
# CONFIG_INET_XFRM_MODE_BEET is not set
# CONFIG_INET_DIAG is not set
# CONFIG_IPV6 is not set
CONFIG_CFG80211=y
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=y
CONFIG_MAC80211_LEDS=y
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_MTD=y
CONFIG_MTD_M25P80=y
CONFIG_MTD_SPI_NOR=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_NETDEVICES=y
# CONFIG_NET_VENDOR_ARC is not set
# CONFIG_NET_CADENCE is not set
# CONFIG_NET_VENDOR_BROADCOM is not set
# CONFIG_NET_VENDOR_CIRRUS is not set
# CONFIG_NET_VENDOR_FARADAY is not set
# CONFIG_NET_VENDOR_INTEL is not set
# CONFIG_NET_VENDOR_MARVELL is not set
# CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_NET_VENDOR_NATSEMI is not set
# CONFIG_NET_VENDOR_SAMSUNG is not set
# CONFIG_NET_VENDOR_SEEQ is not set
# CONFIG_NET_VENDOR_SMSC is not set
CONFIG_STMMAC_ETH=y
# CONFIG_NET_VENDOR_VIA is not set
# CONFIG_NET_VENDOR_WIZNET is not set
# CONFIG_INPUT_MOUSEDEV is not set
CONFIG_INPUT_EVDEV=y
CONFIG_KEYBOARD_SUN4I_LRADC=y
# CONFIG_INPUT_MOUSE is not set
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_TOUCHSCREEN_NS2009=y
CONFIG_INPUT_MISC=y
CONFIG_INPUT_AXP20X_PEK=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=8
CONFIG_SERIAL_8250_RUNTIME_UARTS=8
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_HW_RANDOM is not set
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MV64XXX=y
CONFIG_SPI=y
CONFIG_SPI_GPIO=y
CONFIG_SPI_SUN6I=y
CONFIG_GPIO_SYSFS=y
CONFIG_POWER_SUPPLY=y
CONFIG_AXP20X_POWER=y
CONFIG_THERMAL=y
CONFIG_CPU_THERMAL=y
CONFIG_WATCHDOG=y
CONFIG_SUNXI_WATCHDOG=y
CONFIG_MFD_AXP20X_I2C=y
CONFIG_MFD_AXP20X_RSB=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_AXP20X=y
CONFIG_REGULATOR_GPIO=y
CONFIG_MEDIA_SUPPORT=y
CONFIG_DRM=y
CONFIG_DRM_SUN4I=y
CONFIG_DRM_PANEL_SIMPLE=y
CONFIG_DRM_DUMB_VGA_DAC=y
CONFIG_FB_SIMPLE=y
CONFIG_FB_SSD1307=y
CONFIG_BACKLIGHT_PWM=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_SUN4I_CODEC=y
CONFIG_SND_SUN8I_CODEC_ANALOG=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_MUSB_HDRC=y
CONFIG_USB_MUSB_SUNXI=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_USB_GADGET=y
CONFIG_USB_CDC_COMPOSITE=y
CONFIG_MMC=y
CONFIG_MMC_SUNXI=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_RTC_CLASS=y
# CONFIG_RTC_INTF_SYSFS is not set
# CONFIG_RTC_INTF_PROC is not set
CONFIG_DMADEVICES=y
CONFIG_DMA_SUN6I=y
CONFIG_STAGING=y
# CONFIG_SUN8I_A23_CCU is not set
# CONFIG_SUN8I_A33_CCU is not set
# CONFIG_SUN8I_H3_CCU is not set
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_EXTCON=y
CONFIG_PWM_SUN4I=y
CONFIG_PHY_SUN4I_USB=y
CONFIG_NVMEM=y
CONFIG_NVMEM_SUNXI_SID=y
CONFIG_EXT4_FS=y
CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
CONFIG_ROOT_NFS=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_PRINTK_TIME=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y
# CONFIG_FTRACE is not set
CONFIG_CRYPTO_CMAC=y
CONFIG_CRYPTO_DEV_SUN4I_SS=y

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_MACH_SUN8I_V3S=y
CONFIG_DRAM_CLK=360
CONFIG_DRAM_ZQ=14779
CONFIG_DEFAULT_DEVICE_TREE="sun8i-v3s-licheepi-zero"
CONFIG_SPL=y
# CONFIG_CMD_FLASH is not set
# CONFIG_CMD_FPGA is not set
# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_SPL_ISO_PARTITION is not set
# CONFIG_SPL_EFI_PARTITION is not set
# CONFIG_NETDEVICES is not set
CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y

View File

@ -0,0 +1,9 @@
CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_MACH_SUNIV=y
CONFIG_DRAM_CLK=156
CONFIG_DRAM_ZQ=0
# CONFIG_VIDEO_SUNXI is not set
CONFIG_DEFAULT_DEVICE_TREE="suniv-f1c100s-licheepi-nano"
CONFIG_SPL=y
# CONFIG_SPL_DM_SERIAL is not set

View File

@ -0,0 +1,299 @@
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <asm/io.h> //含有ioremap函数iounmap函数
#include <asm/uaccess.h> //含有copy_from_user函数和含有copy_to_user函数
#include <linux/device.h> //含有类相关的设备函数
#include <linux/cdev.h>
#include <linux/platform_device.h> //包含platform函数
#include <linux/of.h> //包含设备树相关函数
#include <linux/fb.h> //包含frame buffer
#include <linux/spi/spi.h>
#include <linux/regmap.h>
#include <linux/gpio.h>
static struct fb_info *myfb; //定义一个fb_info
static struct task_struct *fb_thread; //定义一个线程刷新屏幕
static struct spi_device *fbspi; //保存spi驱动指针
static struct gpio_desc *dc_pin; //dc引脚
static struct gpio_desc *reset_pin; //reset引脚
static u32 pseudo_palette[16]; //调色板缓存区
static void fb_write_reg(struct spi_device *spi, u8 reg)
{
gpiod_set_value(dc_pin, 0); //低电平,命令
spi_write(spi, &reg, 1);
}
static void fb_write_data(struct spi_device *spi, u16 data)
{
u8 buf[2];
buf[0] = ((u8)(data>>8));
buf[1] = ((u8)(data&0x00ff));
gpiod_set_value(dc_pin, 1); //高电平,数据
spi_write(spi, &buf[0], 1);
spi_write(spi, &buf[1], 1);
}
static void fb_set_win(struct spi_device *spi, u8 xStar, u8 yStar,u8 xEnd,u8 yEnd)
{
fb_write_reg(spi,0x2a);
fb_write_data(spi,xStar);
fb_write_data(spi,xEnd);
fb_write_reg(spi,0x2b);
fb_write_data(spi,yStar);
fb_write_data(spi,yEnd);
fb_write_reg(spi,0x2c);
}
static void myfb_init(struct spi_device *spi)
{
gpiod_set_value(reset_pin, 0); //设低电平
msleep(100);
gpiod_set_value(reset_pin, 1); //设高电平
msleep(50);
/* 写寄存器,初始化 */
fb_write_reg(spi,0x36);
fb_write_data(spi,0x0000);
fb_write_reg(spi,0x3A);
fb_write_data(spi,0x0500);
fb_write_reg(spi,0xB2);
fb_write_data(spi,0x0C0C);
fb_write_data(spi,0x0033);
fb_write_data(spi,0x3300);
fb_write_data(spi,0x0033);
fb_write_data(spi,0x3300);
fb_write_reg(spi,0xB7);
fb_write_data(spi,0x3500);
fb_write_reg(spi,0xB8);
fb_write_data(spi,0x1900);
fb_write_reg(spi,0xC0);
fb_write_data(spi,0x2C00);
fb_write_reg(spi,0xC2);
fb_write_data(spi,0xC100);
fb_write_reg(spi,0xC3);
fb_write_data(spi,0x1200);
fb_write_reg(spi,0xC4);
fb_write_data(spi,0x2000);
fb_write_reg(spi,0xC6);
fb_write_data(spi,0x0F00);
fb_write_reg(spi,0xD0);
fb_write_data(spi,0xA4A1);
fb_write_reg(spi,0xE0);
fb_write_data(spi,0xD004);
fb_write_data(spi,0x0D11);
fb_write_data(spi,0x132B);
fb_write_data(spi,0x3F54);
fb_write_data(spi,0x4C18);
fb_write_data(spi,0x0D0B);
fb_write_data(spi,0x1F23);
fb_write_reg(spi,0xE1);
fb_write_data(spi,0xD004);
fb_write_data(spi,0x0C11);
fb_write_data(spi,0x132C);
fb_write_data(spi,0x3F44);
fb_write_data(spi,0x512F);
fb_write_data(spi,0x1F1F);
fb_write_data(spi,0x2023);
fb_write_reg(spi,0x21);
fb_write_reg(spi,0x11);
mdelay(50);
fb_write_reg(spi,0x29);
mdelay(200);
}
void fb_refresh(struct fb_info *fbi, struct spi_device *spi)
{
int x, y;
u16 *p = (u16 *)(fbi->screen_base);
fb_set_win(spi, 0,0,239,239);
for (y = 0; y < fbi->var.yres; y++)
{
for (x = 0; x < fbi->var.xres; x++)
{
fb_write_data(spi,*p);
p++;
}
}
}
int thread_func_fb(void *data)
{
struct fb_info *fbi = (struct fb_info *)data;
while (1)
{
if (kthread_should_stop())
break;
fb_refresh(fbi,fbspi);
}
return 0;
}
static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)
{
chan &= 0xffff;
chan >>= 16 - bf->length;
return chan << bf->offset;
}
static u32 pseudo_palette[16];
static int myfb_setcolreg(u32 regno, u32 red,u32 green, u32 blue,u32 transp, struct fb_info *info)
{
unsigned int val;
if (regno > 16)
{
return 1;
}
val = chan_to_field(red, &info->var.red);
val |= chan_to_field(green, &info->var.green);
val |= chan_to_field(blue, &info->var.blue);
pseudo_palette[regno] = val;
return 0;
}
static struct fb_ops myfb_ops = {
.owner = THIS_MODULE,
.fb_write = fb_sys_write,
.fb_setcolreg = myfb_setcolreg, /*设置颜色寄存器*/
.fb_fillrect = sys_fillrect, /*用像素行填充矩形框,通用库函数*/
.fb_copyarea = sys_copyarea, /*将屏幕的一个矩形区域复制到另一个区域,通用库函数*/
.fb_imageblit = sys_imageblit, /*显示一副图像,通用库函数*/
};
static void myfb_update(struct fb_info *fbi, struct list_head *pagelist)
{
//比较粗暴的方式,直接全部刷新
fbi->fbops->fb_pan_display(&fbi->var,fbi); //将应用层数据刷到FrameBuffer缓存中
}
static struct fb_deferred_io myfb_defio = {
.delay = HZ/20,
.deferred_io = &myfb_update,
};
static struct fb_var_screeninfo myfb_var = {
.rotate = 0,
.xres = 240,
.yres = 240,
.xres_virtual = 240,
.yres_virtual = 240,
.bits_per_pixel = 16,
.nonstd = 1,
/* RGB565 */
.red.offset = 11,
.red.length = 5,
.green.offset = 5,
.green.length = 6,
.blue.offset = 0,
.blue.length = 5,
.transp.offset = 0,
.transp.length = 0,
.activate = FB_ACTIVATE_NOW,
.vmode = FB_VMODE_NONINTERLACED,
};
static struct fb_fix_screeninfo myfb_fix = {
.type = FB_TYPE_PACKED_PIXELS,
.visual = FB_VISUAL_TRUECOLOR,
.line_length = 240*2,//16 bit = 2byte
.accel = FB_ACCEL_NONE,//没有使用硬件加速
.id = "myfb",
};
static int myfb_probe(struct spi_device *spi)
{
int ret;
void *gmem_addr;
u32 gmem_size;
fbspi = spi; //保存spi驱动指针
printk(KERN_ERR"register myfb_spi_probe!\n");
dc_pin = devm_gpiod_get(&spi->dev,"dc",GPIOF_OUT_INIT_LOW);
if(IS_ERR(dc_pin))
{
printk(KERN_ERR"fail to request dc-gpios!\n");
return -1;
}
reset_pin = devm_gpiod_get(&spi->dev,"reset",GPIOF_OUT_INIT_HIGH);
if(IS_ERR(reset_pin))
{
printk(KERN_ERR"fail to request reset-gpios!\n");
return -1;
}
gpiod_direction_output(dc_pin,0);
gpiod_direction_output(reset_pin,1);
printk(KERN_INFO"register myfb_probe dev!\n");
myfb = framebuffer_alloc(sizeof(struct fb_info), &spi->dev); //向内核申请fb_info结构体
//初始化底层操作结构体
myfb->fbops = &myfb_ops;
gmem_size = 240 * 240 * 2;
gmem_addr = kmalloc(gmem_size,GFP_KERNEL); //分配Frame Buffer显存
if(!gmem_addr)
{
printk(KERN_ERR"fail to alloc fb buffer!\n");
}
myfb->pseudo_palette = pseudo_palette;
myfb->var = myfb_var;
myfb->fix = myfb_fix;
myfb->screen_buffer = gmem_addr;
myfb->screen_size = gmem_size;
myfb->fix.smem_len = gmem_size;
myfb->fix.smem_start = (u32)gmem_addr;
memset((void *)myfb->fix.smem_start, 0, myfb->fix.smem_len); //清楚显示缓存
myfb_init(spi);
myfb->fbdefio = &myfb_defio;
fb_deferred_io_init(myfb);
ret = register_framebuffer(myfb);
if(ret)
{
framebuffer_release(myfb);
unregister_framebuffer(myfb);
devm_gpiod_put(&spi->dev, dc_pin);
devm_gpiod_put(&spi->dev, reset_pin);
printk(KERN_ERR"fail to register fb dev!\n");
return -1;
}
fb_thread= kthread_run(thread_func_fb, myfb, spi->modalias);
return 0;
}
int myfb_remove(struct spi_device *spi)
{
fb_deferred_io_cleanup(myfb); //清除刷新机制
unregister_framebuffer(myfb);
devm_gpiod_put(&spi->dev, dc_pin);
devm_gpiod_put(&spi->dev, reset_pin);
return 0;
}
struct of_device_id myfb_match[] = {
{.compatible = "test,myfb-spi"},
{},
};
struct spi_driver myfb_drv = {
.probe = myfb_probe,
.remove = myfb_remove,
.driver = {
.owner = THIS_MODULE,
.name = "myfb_spi_driver",
.of_match_table = myfb_match,
},
};
module_spi_driver(myfb_drv);
MODULE_LICENSE("GPL"); //不加的话加载会有错误提醒
MODULE_AUTHOR("1477153217@qq.com"); //作者
MODULE_VERSION("0.1"); //版本
MODULE_DESCRIPTION("myfb_spi_driver"); //简单的描述

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
doc/~WRL0402.tmp Normal file

Binary file not shown.