msm8953 uart 구성

21841 단어

카탈로그

  • 1. 장치 트리 수정
  • 1.msm8953.dtsi에 코드 추가
  • 2. msm8953-pinctrl.dtsi에 코드 추가
  • 3.msm8953-nopmi-qrd.dtsi에 코드 추가
  • 2. 루트 파일 시스템에서 장치 트리 보기
  • a./sys/firmware/fdt
  • b./sys/firmware/devicetree
  • c./sys/devices/platform
  • d./proc/device-tree
  • 셋째, 문제
  • 넷째, 수정 드라이브 보기
  • 참조 링크: MSM8937-MSM8953 UART 구성 디버깅 가이드
    uart 드라이브는 내장 드라이브를 사용합니다. 직접 작성할 필요가 없고, 일반적으로 장치 트리만 수정할 수 있습니다.

    1. 장치 트리 수정


    장치 트리의 구성은 다음과 같습니다.

    1.msm8953.dtsi에 코드 추가

    	blsp2_uart2: serial@7af0000 {
    		compatible = "qcom,msm-lsuart-v14";
    		reg = <0x7af0000 0x200>;
    		interrupts = <0 307 0>;
    		status = "disabled";
    		clocks = <&clock_gcc clk_gcc_blsp2_uart2_apps_clk>,
    			<&clock_gcc clk_gcc_blsp2_ahb_clk>;
    		clock-names = "core_clk", "iface_clk";
    	};
    

    2. msm8953-pinctrl.dtsi에 코드 추가

    		hsuart_active: default {
    			mux {
    				pins = "gpio20", "gpio21";
    				function = "blsp_uart6";
    			};
    
    			config {
    				pins = "gpio20", "gpio21";
    				drive-strength = <2>;
    				bias-disable;
    			};
    		};
    
    		hsuart_sleep: sleep {
    			mux {
    				pins = "gpio20", "gpio21";
    				function = "gpio";
    			};
    
    			config {
    				pins = "gpio20", "gpio21";
    				drive-strength = <2>;
    				bias-disable;
    			};
    		};
    

    3.msm8953-nopmi-qrd에서.dtsi에 코드 추가

    &blsp2_uart2 {
    	status = "ok";
    	pinctrl-names = "default";
    	pinctrl-0 = <&hsuart_active>;
    };
    

    장치 트리 설정이 완료되면 bootimage, 브러시, 리셋을 컴파일합니다.
    # user2 @ user2-HP-280-Pro-G2-MT-Legacy in ~/work/dujuan/out/target/product/msm8953_64 [14:13:25] 
    $ adb reboot bootloader       
    
    # user2 @ user2-HP-280-Pro-G2-MT-Legacy in ~/work/dujuan/out/target/product/msm8953_64 [14:13:30] 
    $ fastboot flash boot boot.img 
    target reported max download size of 536870912 bytes
    sending 'boot' (24775 KB)...
    OKAY [  0.710s]
    writing 'boot'...
    OKAY [  0.358s]
    finished. total time: 1.068s
    
    # user2 @ user2-HP-280-Pro-G2-MT-Legacy in ~/work/dujuan/out/target/product/msm8953_64 [14:13:35] 
    $ fastboot reboot
    

    장치가 시작된 후 예상되는/dev/ttyHSL3의 장치 노드를 찾을 수 없습니다.여기서 생각나는 것은 먼저 설비 트리가 정확하게 수정되었는지 확인하는 것이다.

    2. 루트 파일 시스템에서 장치 트리 보기


    참고 자료: 장치 트리 학습(10. 루트 파일 시스템에서 장치 트리 보기) 루트 파일 시스템에서 장치 트리 보기(디버깅에 도움) 아래 핵은 전재에 속한다.

    a. /sys/firmware/fdt


    /sys/firmware 디렉터리에 들어가면 두 개의 파일을 볼 수 있습니다. 하나는 devicetree 폴더이고, 다른 하나는 fdt(원시 dtb 파일,hexdump-C fdt로 출력해서 보면 안에 있는 데이터와 dtb 파일이 일치합니다.)

    b. /sys/firmware/devicetree


    디렉터리 구조로 보이는 dtb 파일입니다.루트 노드는base 디렉터리에 대응하고, 노드마다 디렉터리에 대응하며, 속성마다 파일에 대응한다

    c. /sys/devices/platform


    시스템의 모든 platformdevice, 장치 트리에서 온 것도 있고, 온 것도 있습니다.c 파일에 등록된 장치 트리의 platformdevice,/sys/devices/platform//of 에 들어갈 수 있습니다de는 장치 트리 속성을 봅니다. (예:/sys/devices/platform/led/이 디렉터리에 of node 노드가 있는 것을 발견하면 이platform device가 장치 트리에서 온 것을 나타냅니다.)

    d. /proc/device-tree


    링크 파일입니다./sys/firmware/devicetree/base를 가리킵니다.
    dump의 fdt 파일을 보니 uart6의 설정 정보가 있고 설정이 정확합니다.그리고 인터넷에 올라가서 자료를 찾아봐.

    질문

      uart      ,               。
    

    4. 수정 드라이브 보기


    네트워크에서 참고 자료를 찾았을 때 드라이버를 수정해야 한다는 것을 발견했습니다. 여기 있는 uart는 설정된 4번 uart입니다.kernel/msmsm-3.18/drivers/tty/serial 경로에서 msm 를 수정해야 합니다.serial_hs_lite.c 파일.아래와 같이 변경합니다.
    static struct msm_hsl_port msm_hsl_uart_ports[] = {
    	{
    		.uart = {
    			.iotype = UPIO_MEM,
    			.ops = &msm_hsl_uart_pops,
    			.flags = UPF_BOOT_AUTOCONF,
    			.fifosize = 64,
    			.line = 0,
    		},
    	},
    	{
    		.uart = {
    			.iotype = UPIO_MEM,
    			.ops = &msm_hsl_uart_pops,
    			.flags = UPF_BOOT_AUTOCONF,
    			.fifosize = 64,
    			.line = 1,
    		},
    	},
    	{
    		.uart = {
    			.iotype = UPIO_MEM,
    			.ops = &msm_hsl_uart_pops,
    			.flags = UPF_BOOT_AUTOCONF,
    			.fifosize = 64,
    			.line = 2,
    		},
    	},
    	{
    		.uart = {
    			.iotype = UPIO_MEM,
    			.ops = &msm_hsl_uart_pops,
    			.flags = UPF_BOOT_AUTOCONF,
    			.fifosize = 64,
    			.line = 3,
    		},
    	},
    };
    

    로그를 보십시오. 정확한 로드 드라이브가 있으면 detected port #%d (ttyHSL%d) 의 로그를 출력하고 probe 함수를 분석합니다.probe 함수 코드는 다음과 같습니다.
    static int msm_serial_hsl_probe(struct platform_device *pdev)
    {
    	struct msm_hsl_port *msm_hsl_port;
    	struct resource *uart_resource;
    	struct resource *gsbi_resource;
    	struct uart_port *port;
    	struct msm_serial_hslite_platform_data *pdata;
    	const struct of_device_id *match;
    	u32 line;
    	int ret;
    
    	if (pdev->id == -1)
    		pdev->id = atomic_inc_return(&msm_serial_hsl_next_id) - 1;
    
    	/* Use line (ttyHSLx) number from pdata or device tree if specified */
    	pdata = pdev->dev.platform_data;
    	if (pdata)
    		line = pdata->line;
    	else
    		line = pdev->id;
    
    	/* Use line number from device tree alias if present */
    	if (pdev->dev.of_node) {
    		dev_dbg(&pdev->dev, "device tree enabled
    "
    ); ret = of_alias_get_id(pdev->dev.of_node, "serial"); if (ret >= 0) line = ret; pdata = msm_hsl_dt_to_pdata(pdev); if (IS_ERR(pdata)) return PTR_ERR(pdata); pdev->dev.platform_data = pdata; } if (unlikely(line < 0 || line >= UART_NR)) return -ENXIO; pr_info("detected port #%d (ttyHSL%d)
    "
    , pdev->id, line); ......

    probe 함수 코드에서 line에 대한 판단은 다음과 같습니다.
    //    UART_NR              msm_hsl_uart_ports       
    #define UART_NR	ARRAY_SIZE(msm_hsl_uart_ports)
    
    static int msm_serial_hsl_probe(struct platform_device *pdev)
    {
    
    	/* Use line (ttyHSLx) number from pdata or device tree if specified */
    	pdata = pdev->dev.platform_data;
    	if (pdata)
    		line = pdata->line;		//       ,  pdata     line      ?
    	else
    		line = pdev->id;
    
    	/* Use line number from device tree alias if present */
    	......
    
    	if (unlikely(line < 0 || line >= UART_NR))
    		return -ENXIO;	//    UART_NR             
    

    요약: msmhsl_uart_ports의 요소 개수가 3이면 장치 트리에 네 번째uart를 설정하면 프로브 함수를 직접 끝내고 관련 로그를 출력하지 않습니다.msmhsl_uart_ports에 요소를 추가하면 내가 겪는 문제를 해결할 수 있습니다.

    좋은 웹페이지 즐겨찾기