u1：CSM400B的UART1简称。
u2：CSM400B的UART2简称。

'#'开头的命令为板子执行。
'$'开头的命令为电脑执行。

一、设备树
	不同平台设备树可能有差异，以M3568平台（linux5.10.110）uart8配置模块u1，uart9配置模块u2为例：
	...
	&uart9 {
		status = "okay";
		dma-names = "tx", "rx";                    /* open dma */
		
		csm400b_u1: csm400b-u1{
			compatible = "zhiyuan,csm400b-uart";
			gpios = <&gpio1 24 0                   /* for rst */
					 &gpio1 25 0>;                 /* for cfg */

			gid = <0>;                             /* using the same group id for the same csm400b */
			uid = <1>;                             /* 1:u1  2:u2 */
			status = "okay";
		};
	};

	&uart4 {
		status = "okay";
		dma-names = "tx", "rx";                    /* open dma */

		csm400b_u2: csm400b-u2{
			compatible = "zhiyuan,csm400b-uart";
			gid = <0>;                             /* using the same group id for the same csm400b */
			uid = <2>;                             /* 1:u1  2:u2 */
			status = "okay";
		};
	};
	...
	
	注：1、gid是csm400b的模组号，比如一个M3568接2个csm400b，gid就是用于区分不同的模组。
		2、usn是模块的uart序号。
		3、只有uart1能配置模块，需要配置gpios（需要按顺序填写，先RST，后CFG）。

		
二、驱动文件
	1、将CSM400B的驱动csm400b.c、csm400b_spi.c、csm400b.h拷贝到kernel/drivers/net/can目录。
	2、修改kernel/drivers/net/can/Makefile（不要使用obj-y的写法，会影响到驱动）
		+	obj-$(CONFIG_CAN_CSM400B) += csm400b.o
		
	3、修改kernel/drivers/net/can/Kconfig
		+	config CAN_CSM400B
		+		tristate "zlg csm400b to can device"
		+		depends on TTY && SERIAL_DEV_CTRL_TTYPORT && SERIAL_DEV_BUS
		+		help
		+			Support for ZLG CSM400B to CAN interfaces.
		+			This is a CAN device driver which registers as an serial、spi adapter
		+			and gpiochip to expose these functions of the CSM400B.
	
	4、修改linux内核配置make menuconfig
		+	CONFIG_SERIAL_DEV_BUS=y
		+	CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
		+	CONFIG_CAN_CSM400B=y
		
三、使用方法
			
	1、使能can设备进行收发。
		csm400b驱动加载时会检查模块是否可以正常，如果正常内核log中会出现"uart check ok"相关信息（该信息与spi是互斥的）。
		# dmesg | grep "csm400b"
		...
		csm400b-uart serial0-0 can3: GID = 0, uart check ok.
		...

		# ip link set can3 down
		# ip link set can3 type can bitrate 1000000 dbitrate 5000000 fd on
		# ip link set can3 up
	
四、寄存器读写方法	
	1、先明确u1对应的设备文件。
		因平台不同，设备对应的文件位置是不确定的，以M3568平台（linux5.10.110）为例：
		# find /sys -name "csm400b-uart"
		/sys/bus/serial/drivers/csm400b-uart
		
		# ll /sys/bus/serial/drivers/csm400b-uart
		...
		serial0-0 -> ../../../../devices/platform/fe6c0000.serial/serial0/serial0-0/
		serial1-0 -> ../../../../devices/platform/fe6d0000.serial/serial1/serial1-0/
		...
		
		注：	可以看到存在两个设备serial0-0、serial1-0，因为我配置的u1是fe6c0000.serial（uart8），所以明确serial0-0为u1设备（一般情况下第一个就是u1）。
	
	2、查看或者修改模块寄存器。
		# ls /sys/bus/serial/drivers/csm400b-uart/serial0-0
		channel  driver  modalias  net  of_node  power  registers  subsystem  uevent
		
		注：	
			1、只有u1设备存在channel、registers这两个文件。
			2、channel文件是用于cat查看、echo修改u1对应的can通道的（只有01h寄存器值为0x1时修改通道有效），1对应canfd1，2对应canfd2，例：
			# cat channel
			# echo 2 > channel
			
			3、registers文件是用于cat查看、echo修改模块寄存器配置的（echo命令，先寄存器地址，后寄存器值），例：
			# cat registers
			# echo 0x1 0x7 > registers
	





	
	